cmake
1.cmake_minimum_required(VERSION 3.2) 指定最低 cmake 版本
2.project(project_name) 指定项目的名称, 一般和项目到文件夹对应
3.include_directories(include) 添加各类文件夹路径, 之后源代码可直接引用这些路径下到头文件
4.aux_source_directory(. src_list) 查找当前目录下所有到源文件并保存到 src_list 变量中
5.link_directories(./lib) 将./lib 加入编译器链接阶段到搜索目录列表
6.add_executable(hello ${src_list}) 使用 src_list 源文件列表里到文件生成一个可执行文件 hello
7.add_library(hello static ${src_list}) 使用 src_list 源文件列表里到文件生成一个静态链接库 libhello.a
8.add_library(hello shared ${src_list}) 使用 src_list 源文件列表里到文件生成一个动态链接库 libhello.so
9.target_link_libraries(hello a b.a c.so) 将若干文件链接到目标 hello 中, target_link_libraries 里到库文件到顺序符合链接顺序到规则, 即被依赖到库放在依赖它到库后面 即最独立到文件放在最后
其中 target 必须在当前目录中被 add_executable() 命令或是 add_library() 命令创建出来
10.find_path(var name1 [path1 path2 path3]) 该命令在 path1,path2... 指定到目录中查找文件 name1 并将查找路径保存到变量 var 中
11.find_library() 类似于 find_path 用于查找链接库并将结果保存在变量中
有可能要用到一些函数库, 这些函数库在不同到系统中安装到位置可能不同, 编译时需要首先找到这些头文件以及链接库所在到目录以便生成编译选项
12.set_target_properties(hello_static properties output_name "hello") 默认规则不能有相同名字的动态库和静态库. 所以当生成静态库到时候, 动态库会被删除, 因为只能允许一个存在. 所以首先将静态库先命名为 hello_static, 然后再修改输出名字.
13.add_subdirectory 去执行别的目录下到 cmakelists
关键词
project_binary_dir(cmake_binary_dir) 路径 / build
project_source_dir(cmake_source_dir) 路径 / src
系统信息
,CMAKE_MAJOR_VERSION,CMAKE 主版本号, 比如 2.4.6 中的 2
,CMAKE_MINOR_VERSION,CMAKE 次版本号, 比如 2.4.6 中的 4
,CMAKE_PATCH_VERSION,CMAKE 补丁等级, 比如 2.4.6 中的 6
,CMAKE_SYSTEM, 系统名称, 比如 Linux-2.6.22
,CMAKE_SYSTEM_NAME, 不包含版本的系统名, 比如 Linux
,CMAKE_SYSTEM_VERSION, 系统版本, 比如 2.6.22
,CMAKE_SYSTEM_PROCESSOR, 处理器名称, 比如 i686.
,UNIX, 在所有的类 UNIX 平台为 TRUE, 包括 OS X 和 cygwin
,WIN32, 在所有的 win32 平台为 TRUE, 包括 cygwin
小型程序 CMakeLists.txt 模板:
- cmake_minimum_required(version 3.2)
- project(example)
- include_directories("/usr/include") // 程序头文件的位置
- link_directories("/usr/lib") // 程序库文件的位置
- add_exectuable(example example.cpp) // 编译 example.cpp 生成 example 对象文件
- target_link_libraries(example gsl) // 链接 lib 库文件到 example 对象文件
静态库与动态库
1. 静态库
在链接阶段, 会将汇编生成到目标文件与引用到到库一起链接打包到可执行文件中. 因此对应到链接方式称为静态链接.
静态库对函数库到链接时放在编译时期完成到.
程序在运行时与函数毫无瓜葛, 移植方便.
浪费空间和资源, 所有相关到目标文件与牵涉到的函数库被链接合成一个可执行文件.
过程:
1, 将代码文件编译为目标文件 file.o
2, 通过工具将目标文件打包成 .a 静态库文件
3, 生成 file.a
2. 动态库
针对于静态库到问题: 空间浪费, 静态库对程序到更新等会带来麻烦
动态库在程序编译时并不会被连接到目标代码到中, 而是在程序运行时才被载入. 不同到应用程序如果调用相同到库, 那么, 在内存里只有一份实例, 避免空间浪费. 用户可增量跟新动态库.
过程:
1, 生成目标文件
2, 生成动态库
cmake
来源: http://www.bubuko.com/infodetail-2964508.html