CMake PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR区别

看了好多网上的文章,都说PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR是等价的。

实际不然。

一般来说,都是这样用 

cmake ./

这样PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR是等价的。也就是当前源码的目录。

如果执行cmake的时候,并不在源码的路径的话,比如

cmake ../src

这样的好处是cmake生成的文件和编译出来的东西,就不放在源码路径下了,保证了源码路径的干净整洁。

比如可以在src的同级目录下建立build目录。

然后在build目录下执行cmake ../src。

这样编译出来的东西和cmake生成的东西,都放到了build目录下了。并且

PROJECT_BINARY_DIR=全路径/build

PROJECT_SOURCE_DIR=全路径/src

  • 20
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
cmake_minimum_required(VERSION 3.16) # 声明该项目的名称和版本号 project(MyLib VERSION 1.0) # 添加库代码文件到该库 add_library(mylib STATIC src/header.cpp) target_include_directories(mylib INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include> ) add_library(mylib_shared SHARED src/header.cpp) target_include_directories(mylib_shared INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include> ) # include_directories(include) # 指定install路径,以便于其他项目找到该库 install(TARGETS mylib mylib_shared EXPORT MyLibTargets ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin) install(FILES include/header.h DESTINATION include) # 生成MyLibConfig.cmake文件 include(CMakePackageConfigHelpers) write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/MyLibConfigVersion.cmake" VERSION ${MyLib_VERSION} COMPATIBILITY AnyNewerVersion ) configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/MyLibConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/MyLibConfig.cmake" INSTALL_DESTINATION cmake ) install( EXPORT MyLibTargets NAMESPACE MyLib:: DESTINATION cmake ) # export(EXPORT MyLibTargets # NAMESPACE MyLib:: # FILE MyLibTargets.cmake) # install(FILES ${CMAKE_CURRENT_BINARY_DIR}/MyLibTargets.cmake DESTINATION cmake) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/MyLibConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/MyLibConfigVersion.cmake" DESTINATION cmake )为什么执行时,提醒/home/czl/cmake_lib/src/header.cpp:1:10: fatal error: header.h: 没有那个文件或目录
05-30
在你的 `CMakeLists.txt` 文件中,你已经将 `include/header.h` 安装到了 `include` 目录中,但是在 `add_library` 命令中没有将该目录添加到编译器的 include 路径中,所以编译器无法找到该头文件。 你可以将 `target_include_directories` 命令添加到 `add_library` 命令中,这样就可以将 `include` 目录添加到编译器的 include 路径中了。修改后的代码如下所示: ```cmake cmake_minimum_required(VERSION 3.16) project(MyLib VERSION 1.0) # 添加库代码文件到该库 add_library(mylib STATIC src/header.cpp) target_include_directories(mylib PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include> ) add_library(mylib_shared SHARED src/header.cpp) target_include_directories(mylib_shared PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include> ) # 指定install路径,以便于其他项目找到该库 install(TARGETS mylib mylib_shared EXPORT MyLibTargets ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin) install(FILES include/header.h DESTINATION include) # 生成MyLibConfig.cmake文件 include(CMakePackageConfigHelpers) write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/MyLibConfigVersion.cmake" VERSION ${MyLib_VERSION} COMPATIBILITY AnyNewerVersion ) configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/MyLibConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/MyLibConfig.cmake" INSTALL_DESTINATION cmake ) install( EXPORT MyLibTargets NAMESPACE MyLib:: DESTINATION cmake ) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/MyLibConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/MyLibConfigVersion.cmake" DESTINATION cmake ) ``` 注意,在这里,我们使用了 `PUBLIC` 修饰符,将 include 路径添加到了 `mylib` 和 `mylib_shared` 目标的 include 路径中,这样在编译 `mylib` 和 `mylib_shared` 时都可以找到 `include/header.h` 头文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值