cmake编写

目录

1.基本框架

 2.include_directories

3. find_package

6. add_library

7. add_subdirectory

8.设置CMAKE_CXX_FLAGS变量 

 9.aux_source_directory


1.基本框架

cmake_minimum_required (VERSION 3.6)
project (box)
add_executable(box box.cxx)
cmake_minimum_required()
  • 作用:指定运行此配置文件所需的 CMake 的最低版本; 

注意:cmake的语法支持大小、小写和大小写混合。

  • cmake_minimum_required
  • CMAKE_MINIMUM_REQUIRED
  • cmake_MINUMUM_required

上面三种写法是相同的,只有系统指令是不区分大小写的,但是变量和字符串是区分大小写的

project(<PROJECT-NAME> [LANGUAGES] [<language-name>...]) 
  •  作用:定义工程名称和支持的语言
  • 变量: PROJECT_SOURCE_DIR,PROJECT_BINARY_DIR


add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
  •  作用:生成可执行文件
add_executable(mytool mytool.cpp)

 2.include_directories

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

作用:

  • 将dir1 [dir2 ...] 文件夹下的头文件添加到编译环境中;

  • AFTER 或者 BEFORE 指定了要添加的路径是添加到原有包含列表之前或之后

  • 若指定 SYSTEM 参数,则把被包含的路径当做系统包含路径来处理

3. find_package

find_package(<package> [version] [EXACT] [QUIET] [MODULE]
             [REQUIRED] [[COMPONENTS] [components...]]
             [OPTIONAL_COMPONENTS components...]
             [NO_POLICY_SCOPE])
  • version参数:版本号,它是正在查找的包应该兼容的版本号(格式是major[.minor[.patch[.tweak]]])。
  • REQUIRED 参数:指是否是工程必须的,如果没有找到的话,cmake的过程会终止,并输出警告信息。对应于Find<name>.cmake模块中的 NAME_FIND_REQUIRED 变量。
  • COMPONENTS参数:在它们的后面可以列出一些与包相关依赖的部件清单(components list)
  • 生成的变量:
<NAME>_FOUND//是否找到库的标志
<NAME>_INCLUDE_DIRS or <NAME>_INCLUDES//库的头文件路径
<NAME>_LIBRARIES or <NAME>_LIBRARIES or <NAME>_LIBS//库文件路径
<NAME>_DEFINITIONS

find_package如何工作的:

https://blog.csdn.net/bytxl/article/details/50637277

https://blog.csdn.net/chengde6896383/article/details/86497016

https://blog.csdn.net/u011092188/article/details/61425924

link_libraries(library1 <debug | optimized> library2 ...)
  • 作用:将库链接到以后添加的所有目标
  • 例如:
link_libraries("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")
  • 不推荐使用。请改用target_link_libraries()命令。
target_link_libraries(<target> [item1 [item2 [...]]]
                      [[debug|optimized|general] <item>] ...)
  • 作用:将目标文件与库文件进行链接。 
  • 区别:target_link_libraries 要在 add_executable 之后;link_libraries 要在 add_executable 之前

上述指令中的<target>是指通过add_executable()和add_library()指令生成已经创建的目标文件。而[item]表示库文件没有后缀的名字。默认情况下,库依赖项是传递的。当这个目标链接到另一个目标时,链接到这个目标的库也会出现在另一个目标的连接线上。这个传递的接口存储在interface_link_libraries的目标属性中,可以通过设置该属性直接重写传递接口。 

target_link_libraries(myProject comm)       # 连接libhello.so库,默认优先链接动态库
target_link_libraries(myProject libcomm.a)  # 显示指定链接静态库
target_link_libraries(myProject libcomm.so) # 显示指定链接动态库

6. add_library

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [source1] [source2] [...])
  • 作用:生成链接库
  • <name>:库文件的名字,该库文件会根据命令里列出的源文件来创建。
  • STATIC、SHARED和MODULE:指定生成的库文件的类型。

add_library(archive archive.cpp zip.cpp lzma.cpp)
add_executable(zipapp zipapp.cpp)
target_link_libraries(zipapp archive)

上述例子中arvhive被定义为一个静态库,包含来自archive.cppzip.cpplzma.cpp的编译后的对象。zipapp是一个可执行文件通过编译链接zipapp.cpp得到。在链接zipapp可执行文件时,archive静态库会被链入。

7. add_subdirectory

add_subdirectory(source_dir [binary_dir]
                 [EXCLUDE_FROM_ALL])
  • 作用:添加子目录,主要用于多模块的构建

例子1:以子模块sub2依赖子模块sub1。

  • 目录结构为:

  • 主要内容 :

 例子2:

  • 根目录中的 CMakeLists.txt :
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo3)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 添加 math 子目录
add_subdirectory(math)
# 指定生成目标 
add_executable(Demo main.cc)
# 添加链接库
target_link_libraries(Demo MathFunctions)
  • 子目录中的 CMakeLists.txt:
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)
# 生成链接库
add_library (MathFunctions ${DIR_LIB_SRCS})

add_subdirectory 指明本项目包含一个子目录 math,这样 math 目录下的 CMakeLists.txt 文件和源代码也会被处理 。第6行,使用命令 target_link_libraries 指明可执行文件 main 需要连接一个名为 MathFunctions 的链接库 。 

8.设置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包优化

 9.aux_source_directory

aux_source_directory(<dir> <variable>)
  • 作用:查找dir路径下的所有源文件,保存到variable变量中
aux_source_directory(./src ${hello_src})

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

 参考:

http://ijinjay.github.io/blog/2017-04/CMake%E4%BD%BF%E7%94%A8.html

https://blog.csdn.net/afei__/article/details/81201039

发布了44 篇原创文章 · 获赞 26 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/He3he3he/article/details/103701098