2024年CMake 常用命令和变量_代码文件夹包括include、lib、src(1),2024Golang春招

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

└── main.cpp`


三个文件夹: include, lib, src分别存放包含文件,库文件,源文件;一个CMakeLists.txt脚本。下面我的任务是编写这个脚本,使得工程包含util.h头文件,编译main.cpp, 链接libutil.a, 最终生成一个可执行文件hello.


## 给工程起个名字


加上这句:`project(hello)`


解释


命令:`project(<PROJECT-NAME> [LANGUAGES] [<language-name>...])`


作用:定义工程名称, 设置几个变量的名字: `PROJECT_NAME, PROJECT_SOURCE_DIR, <PROJECT-NAME>_SOURCE_DIR, PROJECT_BINARY_DIR, <PROJECT-NAME>_BINARY_DIR`, 高级用法请见参考链接2:CMake命令


## 让CMake找到我的头文件


加上这句:`include_directories(./include)`


作用:把当前目录(CMakeLists.txt所在目录)下的include文件夹加入到包含路径


我习惯这样写:`include_directories(${CMAKE_CURRENT_LIST_DIR}/include)`


解释


命令: `include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])`


作用:


* 把dir1, [dir2 …]这(些)个路径添加到当前CMakeLists及其子CMakeLists的头文件包含路径中;
* AFTER 或者 BEFORE 指定了要添加的路径是添加到原有包含列表之前或之后
* 若指定 SYSTEM 参数,则把被包含的路径当做系统包含路径来处理


第二种写法里用到了`CMAKE_CURRENT_LIST_DIR`这个变量,它表示当前CMakeLists所在的路径.


## 让CMake找到我的源文件


加上: `aux_source_directory(./src ${hello_src})`


作用: 把当前路径下src目录下的所有源文件路径放到变量`hello_src`中


解释


命令:`aux_source_directory(<dir> <variable>)`


作用:查找dir路径下的所有源文件,保存到variable变量中.


上面的例子中,`hello_src`是一个自定义变量,在执行了`aux_source_directory(./src ${hello_src})`之后,我就可以像这样来添加一个可执行文件:`add_executable(hello ${hello_src})`, 意思是用`hello_src`里面的所有源文件来构建hello可执行程序, 不用手动列出src目录下的所有源文件了。


注意:


* aux\_source\_directory 不会递归包含子目录,仅包含指定的dir目录
* CMake官方不推荐使用aux\_source\_directory及其类似命令(file(GLOB\_RECURSE …))来搜索源文件,原因是这样包含的话,如果我再在被搜索的路径下添加源文件,我不需要修改CMakeLists脚本,也就是说,源文件多了,而CMakeLists并不需要(没有)变化,也就使得构建系统不能察觉到新加的文件,除非手动重新运行cmake,否则新添加的文件就不会被编译到项目结果中。
* 类似`include_directories()`中`CMAKE_CURRENT_LIST_DIR`的用法,也可以写成:`aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/src ${hello_src})`


## 让CMake找到我的库文件


加上:`link_directories(${CMAKE_CURRENT_LIST_DIR}/lib)`


解释


命令:`link_directories(directory1 directory2 ...)`


作用:不必细说,与`include_directories()`类似,这个命令添加了库包含路径。


## 告诉CMake我的构建目标


加上:`add_executable(${PROJECT_NAME} ${hello_src})`


解释


命令:`add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...])`


作用:目前仅需知道,其作用是使用`${hello_src}`里面的源文件来生成一个可执行文件,起名叫`${PROJECT_NAME}`, 即hello. 在一开始定义的那个project(hello)中的hello。


## 告诉CMake我要链接哪个库文件


加上:`target_link_libraries(${PROJECT_NAME} util)`


解释


命令:`target_link_libraries(<target> [item1 [item2 [...]]] [[debug|optimized|general] <item>] ...)`


作用:仅需知道,名字叫`${PROJECT_NAME}`这个target需要链接util这个库,会优先搜索libutil.a(windows上就是util.lib), 如果没有就搜索libutil.so(util.dll, util.dylib)’


上面的例子意思是,让hello去链接util这个库。


## 传递FLAGS给C++编译器


如果我的main.cpp里面用到了C++11,那么我需要告诉CMake在生成的Makefile里告诉编译器启用C++11。与此类似,我可能也要传递其他FLAGS给编译器,怎么办?


答案是:设置`CMAKE_CXX_FLAGS`变量


加上:



`set(CMAKE_CXX_COMPILER “clang++” ) # 显示指定使用的C++编译器

set(CMAKE_CXX_FLAGS “-std=c++11”) # c++11
set(CMAKE_CXX_FLAGS “-g”) # 调试信息
set(CMAKE_CXX_FLAGS “-Wall”) # 开启所有警告

set(CMAKE_CXX_FLAGS_DEBUG “-O0” ) # 调试包不优化
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG " ) # release包优化`


解释


* `CMAKE_CXX_FLAGS` 是CMake传给C++编译器的编译选项,通过设置这个值就好比 `g++ -std=c++11 -g -Wall`
* `CMAKE_CXX_FLAGS_DEBUG` 是除了`CMAKE_CXX_FLAGS`外,在Debug配置下,额外的参数
* `CMAKE_CXX_FLAGS_RELEASE` 同理,是除了`CMAKE_CXX_FLAGS`外,在Release配置下,额外的参数




![img](https://img-blog.csdnimg.cn/img_convert/ebaa70d24b8211364ca1e994b1814fb3.png)
![img](https://img-blog.csdnimg.cn/img_convert/5080aebff5323e9eb8bc08712f76af26.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

*

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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` 头文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值