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
,同时考虑构建类型和许多其他因素,这一个都不知道
我在 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
,同时考虑构建类型和许多其他因素,这一个都不知道