Windows上的clion cmake二进制输出目录问题

时间:2019-02-23 14:11:55

标签: cmake clion

我在Windows上有两个cmake项目。 PROJECT_A输出可执行文件,PROJECT_B输出静态库。 Project_B有自己的cmake文件,可以单独构建。

PROJECT_B位于PROJECT_A的子文件夹中,并且PROJECT_A使用cmake函数add_subdirectory()包含PROJECT_B。

PROJECT_B设置环境变量(PROJECT_B_BUILD_DIR),该变量包含PROJECT_B的CMAKE_CURRENT_BINARY_DIR的值,以便PROJECT_A可以定位并链接到它生成的静态库。

从命令行运行cmake生成PROJECT_A时,PROJECT_B将库输出到PROJECT_B_BUILD_DIR内的Debug或Release子目录,因此PROJECT_A使用以下命令链接到PROJECT_B的输出:

set(LIBS
   debug ${PROJECT_B_BUILD_DIR}/Debug/project_b.lib
   optimized ${PROJECT_B_BUILD_DIR}/Release/project_b.lib
)
target_link_libraries(project_a ${LIBS})

但是,当从CLion中运行cmake时,未创建Debug和Release子目录,并且库直接输出到PROJECT_B_BUILD_DIR中,因此PROJECT_A无法链接到project_b,因为传递到target_link_libraries()的路径现在是错误的。

我可以通过删除传递给target_link_libraries()的路径的“调试”和“释放”部分来解决该问题,但是对于任何从命令行构建项目的人来说,这样做都会破坏构建。

解决这个问题的最佳策略是什么?

1 个答案:

答案 0 :(得分:1)

如果使用add_subdirectory命令包含其他项目,则可以使用该项目的目标名称与该项目中创建的库链接:

target_link_libraries(project_a project_b)

当CMake为链接器调用构建命令行时,它将使用适当的链接器标志替换project_b,同时考虑到构建类型和许多其他东西,甚至连它都不知道。