【问题标题】:clion cmake binary output directory problem on WindowsWindows上的clion cmake二进制输出目录问题
【发布时间】: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 库的正确路径。
  • 我不知道你能做到这一点。彻底解决了我的问题。非常感谢!如果您将此添加为问题答案,我会接受它:)

标签: cmake clion


【解决方案1】:

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

target_link_libraries(project_a project_b)

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

【讨论】:

  • 很好的答案。这解决了我的问题,因为它消除了我手动添加链接目标路径的 MSVC 调试和发布部分的需要。因此,我的 cmake 文件现在更干净、更便携。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多