【问题标题】:Multiple CMake Projects in one CMakeLists.txt一个 CMakeLists.txt 中的多个 CMake 项目
【发布时间】:2012-08-29 23:40:46
【问题描述】:

我希望有两个项目基于相同的源文件构建,第二个项目只有一个小子集,以及一些不同的定义和构建标志。

当我尝试这样的事情时:

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。

我不确定为什么它似乎适用于文件,但不适用于标志。

【问题讨论】:

  • 在单个 CMakeList.txt 文件中不应有超过 1 个 PROJECT()。
  • 除了用 CMakeLists.txt 文件创建一个几乎空的单独目录之外,我还能做些什么吗?
  • 通常我将每个目标放在自己的文件夹中,但是您可以删除第二个 PROJECT() 并将第二个目标中使用的变量名称更改为 this_target 以外的名称。

标签: visual-studio-2010 build cmake


【解决方案1】:

首先,您必须为可执行文件使用不同的名称 如果你想为你的目标添加特定的定义,你可以使用 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_properties 和 LINK_FLAGS

【讨论】:

    【解决方案2】:

    我发现将多个目标放在一个 CMakeLists.txt 中会导致 Visual Studio 2010 上出现间歇性构建失败,这是由于对 generate.stamp 的访问冲突(尽管我不能排除我做错了什么)。因此,您可能必须将目标放在不同的 CMakeLists.txt 文件中,或寻找其他解决方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      相关资源
      最近更新 更多