如何使用CMake在编译时定义编译器标志?

13

add_definitions添加的定义在cmake执行时就已经确定,如果想要在make执行时定义它们怎么办? 这些定义的值将是自定义命令的输出。


这可能会帮助某人 通过CMake定义预处理器宏? - Raaka
3个回答

3

-4

这是一个makefile的例子:

.SUFFIXES: .c.o
CC = cc
INCLUDE = -I/usr/include -I/usr/sys/include
# 取消注释其中一个,两者互斥
CFLAGS = -g # 调试信息
#CFLAGS = -O2 # 优化代码
LIBS = -L/usr/lib -L/usr/sys/lib -lsome_lib1 -lsome_lib2 # 调试库
#LIBS = -L/usr/lib # 发布
FILES = mysource.o myroutines1.o myroutines2.o
APP = myapp
.c.o:
     $(CC) $(INCLUDE) $(CFLAGS) -c $<
all : $(APP) $(APP) : $(FILES) $(CC) -o $@ $(FILES) $(LIBS) $(CFLAGS)
clobber : clean mrproper clean: rm -rf $(FILES)
mrproper: rm -rf $(APP)

注意如何定义标志CFLAGS。根据您正在进行的调试或发布构建取消注释另一个标志。

上面的示例是我教程中用于构建名为myapp的可执行文件的makefile,它由mysource.cmyroutines1.cmyroutines2.c组成。它展示了make如何智能地构建可执行文件而无需重新编译。

注意:该makefile具有Unix/Linux方向性,并且对制表符/空格非常严格,这在上面的示例中不会显示出来!

希望这可以帮助到您, 最好的问候, 汤姆。


不明白为什么这个被踩了,因为楼主明确表示“如何在执行make(而不是cmake)时定义它们?”换句话说,如何在makefile中定义它们,这是我的理解?如果我误解了,请纠正我。 - t0mm13b
6
我不是原帖作者,而且有点晚了......但是......我想像原帖作者一样(像我自己一样),正在寻找一个CMake命令,在自动生成的Makefile中实现这个逻辑。手动编辑Makefile不是一个选项。 - mbauman
@MattB:哦...忘记了这个...有点晚了!!!我知道有一个CMake GUI..这不是一个很好的答案,而是一个指向方向的点,看看CMake GUI上是否有选项可以为您完成此操作并查看它生成了什么... - t0mm13b
谢谢,汤姆。我通过这里其他答案中的链接找到了解决方案 (https://dev59.com/g3M_5IYBdhLWcg3wTRLL#1468695)。我只是想告诉你我认为有人可能会给你的回答踩低分的原因。当然,现在我看到了你对另外一个被踩低分的答案所做的评论,所以你已经知道了。唉…… - mbauman

-5

我不确定我理解这个问题,但是...

也许你可以使用一个额外的宏来提供命令行C编译器标志,例如:

CFLAGS=  <whatever>
CFLAGS2= #nothing  

.c.o:
    $(CC) $(INCLUDE) $(CFLAGS) $(CFLAGS2) -c $<

然后,当你发出make命令时,请提供一个"CFLAGS2=xxx"的命令行参数,它会覆盖makefile中的默认设置。

更新

是的,我没有理解OP的问题。敬请忽略。


@Loadmaster:我在这里做了同样的事情,但由于我不理解楼主的问题而被Downvote了 - 他确实说过“当执行make(而不是cmake)时?” - t0mm13b
1
问题涉及cmake。CMake在Linux平台上生成一个makefile,因此我无法直接修改它。 - Łukasz Lew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接