功夫Panda

记录一些遇到的问题

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  47 随笔 :: 0 文章 :: 18 评论 :: 67万 阅读
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

一般,在开发测试阶段用debug版本,而上线发布用release版本。

使用Makefile定制编译不同版本,避免修改程序和Makefile文件,将会十分方便。

读了一些资料,找到一个解决方法,Makefile预定义宏与条件判断,结合make预定义变量,进行条件编译。

 

比如,有一个test.cpp,包含这段代码

#ifdef debug
//your code
#endif

你希望在debug版本要执行它,在release版本不执行。

我们可以写这样的一个Makefile:

复制代码
 1 ver = debug
 2 
 3 ifeq ($(ver), debug)
 4 ALL: test_d
 5 CXXFLAGS = -c -g -Ddebug
 6 else
 7 ALL: test_r
 8 CXXFLAGS = -c -O3 
 9 endif
10 
11 test_d: test.do
12     g++ -o $@ $^
13 
14 test_r: test.ro
15     g++ -o $@ $^
16 
17 %.do: %.cpp
18     g++ $(CXXFLAGS) $< -o $@
19 
20 %.ro: %.cpp
21     g++ $(CXXFLAGS) $< -o $@
复制代码

简单说一下,Makefile根据ver的不同定义了不同的编译选项CXXFLAGS与输出程序ALL,

debug版本输出程序是test_d,release版本输出程序是test_r

debug版本编译选项是"-c -g -Ddebug",release版本编译选项是"-c -O3"

debug版本object文件后缀是".do",release版本object文件后缀是".ro"

debug版本编译选项使用"-D"定义宏debug,使得your code能够执行。

不同版本的编译选项、object文件、输出程序均不同,所以可以同时编译两个版本的程序,互不影响。

 

Makefile执行时,首先判断ver变量,如果ver的值是debug,编译debug版,否则编译release版。当然,默认情况下是编译debug版的。

如果想编译release版,要怎么做?

只要在执行make时,对ver变量赋值,使得ver的值不为debug,比如

# make ver=release

 

 

如有疏漏,欢迎指正!

posted on   功夫Panda  阅读(48982)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库

点击右上角即可分享
微信分享提示