我在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()的路径的“调试”和“释放”部分来解决该问题,但是对于任何从命令行构建项目的人来说,这样做都会破坏构建。
解决这个问题的最佳策略是什么?
答案 0 :(得分:1)
如果使用add_subdirectory
命令包含其他项目,则可以使用该项目的目标名称与该项目中创建的库链接:
target_link_libraries(project_a project_b)
当CMake为链接器调用构建命令行时,它将使用适当的链接器标志替换project_b
,同时考虑到构建类型和许多其他东西,甚至连它都不知道。