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

clion cmake binary output directory problem on Windows

我在 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 可以定位和 link 反对它生成的静态库。

当运行 cmake 从命令行构建PROJECT_A 时,PROJECT_B 将lib 输出到PROJECT_B_BUILD_DIR 内的Debug 或Release 子目录等PROJECT_A links 对 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 无法 link 反对 project_b 因为传递到 target_link_libraries() 的路径现在是错误的。

我可以通过删除传递给 target_link_libraries() 的路径的调试和发布部分来解决问题,但是这会破坏从命令行构建项目的任何人的构建。

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

如果您使用 add_subdirectory 命令包含其他项目,您可以 link 使用在该项目中创建的库,使用它们的 目标名称 :

target_link_libraries(project_a project_b)

当 CMake 为 linker 调用构造命令行时,它将用适当的 linker 标志替换 project_b,同时考虑构建类型和许多其他因素,这一个都不知道