【发布时间】:2019-02-23 14:11:55
【问题描述】:
我在 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 将 lib 输出到 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() 的路径的调试和发布部分来解决问题,但这会破坏任何从命令行构建项目的人的构建。
解决这个问题有什么好的策略?
【问题讨论】:
-
如果您通过
add_subdirectory命令PROJECT_A使用PROJECT_B,最好(也更简单)使用PROJECT_B的库的目标名称:target_link_libraries(project_a project_b)。当执行实际链接时,CMake 会自动插入到project_b库的正确路径。 -
我不知道你能做到这一点。彻底解决了我的问题。非常感谢!如果您将此添加为问题答案,我会接受它:)