2012-08-29 303 views
4

我想有两个项目构建相同的源文件,第二个只有一个小子集,还有一些不同的定义和构建标志。一个CMakeLists.txt中的多个CMake项目

当我尝试这样的事:

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文件中有超过1个PROJECT()。 – drescherjm

+0

除了用CMakeLists.txt文件创建一个单独的近空目录外,还有什么可以做的吗? – Arelius

+0

通常我会将每个目标放在它自己的文件夹中,但是您可以删除第二个PROJECT()并将第二个目标中使用的变量的名称更改为this_target以外的其他名称。 – drescherjm

回答

5

首先,您必须为可执行文件使用不同的名称 如果您想要将特定定义添加到目标中,可以使用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文件中,或者找到其他解决方法。

相关问题