cmake记录 摘自网络

CMake——第三方库引入

对于大型工程项目,我们往往需要引入一些第三方库来帮助我们更好的解决问题,对于第三方库,有的是编译好的,有的是源码,情况不同,处理方式不同,由于笔者这方面也是刚入门,所以在此记下笔记,以备后续需要.

1.对于有.cmake的第三方库:
list(APPEND CMAKE_PREFIX_PATH "./thirdParty/opencv/build")  #.cmake所在路径  find_package(OpenCV REQUIRED)                                                            add_executable(project main.cpp)
target_link_libraries(project ${OpenCV_LIBS})                                 #将exe与第三方库链接

2.对于需要源码编译(例如src文件夹中含有一堆.h,.cpp文件等)
file(GLOB_RECURSE <变量名> "src/.hpp" "src/.cpp" "src/.h" "src/.c") 
add_library(<库名> STATIC ${变量名})         

3.对于已经编译好的第三方库
add_library(<库名> INTERFACE IMPORTED)     #将已编译好的include和lib封装成你想要的库target_include_directories(<库名> INTERFACE <include文件夹所在路径>)
target_link_directories(<库名> INTERFACE <lib文件夹所在路径>)
target_link_libraries(<库名> INTERFACE <需要的.lib文件>)

4.将很多第三方库统一放在一个文件夹 “thirdparty” 下
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set_target_properties(<库名> PROPERTIES FOLDER "thirdparty")


转自下面
作者:Derek_a223
链接:https://www.jianshu.com/p/8b0a0dad2620
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 
 
 

file(GLOB variable [RELATIVE path] [globbingexpressions]…)
使用该文件操作命令时,相对路径的书写最前面不要加任何修饰,
如:“FILE(GLOB EXTENDED doc/**)”,加载doc文件夹下的所有文件;

 

 

 

习惯错误写法FILE(GLOB EXTENDED /doc/)、FILE(GLOB EXTENDED ./doc/)。
————————————————
版权声明:本文为CSDN博主「justslowdown_going」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/siwen0/article/details/102564310

 
 
打印include路径

include_directories(./include) #默认在build下cmake
get_property(dirs DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
message(STATUS "include_dirs:"${dirs})

 

 

增加多个源文件多个目录下不使用静态库的处理

https://github.com/wzpan/cmake-demo/pull/10/commits/1bc2ec4aa63ead70f5a03677cf06c130d98a6504

 

add_definitions()
这种可以在我们更改别人代码做实验时使用,既不对其源码进行破坏,又可以添加自己的功能。之前都是在程序中进行#define,有了这个后可以直接在编译的时候进行选择。具体的,在工程CMakeLists.txt 中,使用add_definitions()函数控制代码的开启和关闭:

option(TEST_DEBUG "option for debug" OFF)
if (TEST_DEBUG)
  add_definitions(-DTEST_DEBUG)
endif(TEST_DEBUG)

运行构建项目的时候可以添加参数控制宏的开启和关闭.

cmake -DTEST_DEBUG=1 .. #打开
cmake -DTEST_DEBUG=0 .. #关闭

在源码中就可以使用:

#ifdef TEST_DEBUG
...
...
#else
...
#endif
————————————————
原文链接:https://blog.csdn.net/fb_941219/article/details/107376017

 

 

命令行给cmake传递参数

我们期望在编译前将一些信息缓存起来,然后用CMakeLists.txt进行构建时,希望可以访问之前缓存给cmake的变量:

比如我们希望缓存TARGET_CPU,并且他的值为X86,那么我们可以在命令行或者脚本中执行一下操作:

  cmake -DTARGET_CPU:STRING=x86

然后,我们就可以在CMakeLists.txt中使用他帮助我们完全一些逻辑:

  if(TARGET_CPU STREQUAL "x86")
    #do something
  else()
    #do something
  endif()
————————————————
原文链接:https://blog.csdn.net/KingOfMyHeart/article/details/114326024

 

 

参考例子
 
https://www.hahack.com/codes/cmake/
 
1.demo代码下载
https://www.bilibili.com/video/BV16V411k7eF?from=search&seid=10302210214266033807&spm_id_from=333.337.0.0
https://github.com/AdamWSL/CMake_Tutorial.git

2.cmake下载地址
https://cmake.org/download/

3.CMake官方教程— CMake 3.17.0-rc1文档
https://cmake.org/cmake/help/latest/guide/tutorial/index.html

4.CMake入门实战(看完这篇再看视频效果更佳)
https://www.hahack.com/codes/cmake/

5.cmake使用示例与整理总结
https://blog.csdn.net/QTVLC/article/details/82380413

6.CMake命令/函数汇总(翻译自官方手册)
https://www.cnblogs.com/52php/p/5684588.html

7.《CMake实践》
posted @   ooouli  阅读(131)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示