一个CMakeLists.txt文件中包含多个CMake项目

8

我希望有两个项目,它们建立在相同的源文件之上,而第二个项目只是一个小子集,并且有一些不同的定义和构建标志。

当我尝试这样做时:

SET (this_target PROJECT1)
PROJECT(${this_target})

...

ADD_EXECUTABLE(#{this_target} ...)

SET (this_target PROJECT2)
PROJECT(${this_target})

...

add_definitions (-DMYDEFINE)
TARGET_LINK_LIBRARIES( ${this_target} -myflag )

ADD_EXECUTABLE(#{this_target} ...)

它最终会创建两个项目,看起来有适当的源文件之类的,但由于某种原因,在至少在Visual Studio 2010中,两个项目似乎都有MYDEFINE定义和链接器标志中的myflag。我不确定为什么它似乎适用于文件,但不适用于标志。

3
一个 CMakeList.txt 文件中不应该包含超过一个 PROJECT()。 - drescherjm
除了创建一个只有CMakeLists.txt文件的几乎空目录之外,我还能做些什么吗? - Arelius
通常我会将每个目标放在自己的文件夹中,但是你可以删除第二个PROJECT()并更改第二个目标中使用的变量名称为其他名称,而不是this_target。 - drescherjm
2个回答

6

首先,您必须为您的可执行文件使用不同的名称。如果您想要为目标添加特定的定义,可以使用set_target_properties,这样每个目标都将拥有自己的属性(例如编译定义)。

# compile and link first app
add_executable(prg1 ${CommonSources} ${Prg1SpecificSources})
target_link_libraries(prg1 lib1 lib2 lib3)

#set target-specific options
set_target_properties(prg1 PROPERTIES COMPILE_DEFINITIONS "FOO=BAR1")

#...

# compile and link second app
add_executable(prg2 ${CommonSources} ${Prg2SpecificSources})
target_link_libraries(prg2 lib1 lib2 lib3)
#set target-specific options
set_target_properties(prg1 PROPERTIES COMPILE_DEFINITIONS "FOO=BAR2")

如果您想覆盖链接标志,可以使用set_target_propertiesLINK_FLAGS

1
我发现将多个目标放在一个CMakeLists.txt文件中会导致Visual Studio 2010上不定期的构建失败,原因是生成generate.stamp时存在冲突访问(尽管我不能排除我做错了什么)。因此,您可能需要将目标放在不同的CMakeLists.txt文件中,或找到其他解决方法。

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