cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。它会通过写的语句自动生成一个MakeFile,从而实现高效编译
cmake_minimum_required(VERSION 2.8)
这条语句规定了执行这个cmake的版本不能低于2.8,否则会报错,要求升级cmake版本
project(HELLO)
这个命令不是强制性的,但最好都加上。它会引入两个变量 HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR,同时,cmake 自动定义了两个等价的变量 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR
add_executable(name source…)
接着在CmakeList.txt所在的目录下执行
cmake .
make
很多时候我们构建一个二进制文件的时候,可能有几十或上百个.c或.cpp源码参与编译,如果我们在add_executable后一个个指定,效率非常低下,这时候就可以使用aux_source_directory
aux_source_directory(
)
add_library(library_name [STATIC | SHARED | MODULE] EXCLUDE_FROM_ALL source_files)
这里有两种方式,第一种为link_directories与link_libraries搭配使用,还有一种是find_library与target_link_libraries搭配,更加推荐使用第二种,因为可读性更好,可以让我们更好的了解代码的依赖关系,并且可以确保在构建过程中只链接指定的库文件
第一种方式
第二种方式(推荐使用)
find_library(LIBRARY_PATH mylibrar PATHS /path/to/library/directory1 /path/to/library/directory2)
target_link_libraries(target [item1] [item2] …)
其中
item1的设置方式:
- 可以是写死的库,例如库名为libadd.so,可以写成target_link_libraries(demo add)
- 使用set设置变量的方式,set(LIBRARY_PATH /path/to/library),item1使用${LIBRARY_PATH}代替
- add_library(my_library STATIC my_library.cpp) 这种方式会生成一个新的库供使用
- 使用find_library设置的变量来链接
add_definitions(-DXXX)
-D为必须的,XXX为需要设置的宏,这样设置会让下面所有构建的目标都带上这个宏参与编译,同样不推荐使用
第二种:target_compile_definitions (推荐使用)
target_compile_definitions(
…)
需要注意的是,target_compile_definitions需要写在已经构建的目标后,例如target是demo这个可执行文件,那么在target前需要首先调用add_executable,在有demo这个目标后再再调用target_compile_definitions,否则会出现构建报错
以opencv为例
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 …])
如果我们想编译一个二进制文件,而这个二进制文件需要链接一个动态库,这个动态库也是需要实时编译出来给二进制使用的,这时候我们就可以使用add_subdirectory、add_dependencies来建构
add_subdirectory(subdirectory_path binary_output_path)
add_dependencies(target_name dependency_target_name)
下面是目录结构
在主目录下执行cmake. && make,发现lib下生成了libadd.so,并且主目录下生成了我们需要的demo可执行文件,运行结果为3
当我们执行add_executable后,通常需要把二进制放到指定的目录,这时候就可以通过install来实现,相当于操作了make install
到此这篇cmakelist教程(cmakelist怎么写)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!install([Target | File | Directory | Script] my_executable DESTINATION you_path)
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/do-yfwjc/40782.html