一、cmake功能介绍
cmake是跨平台编译工具,编写简单好维护,是make的高级用法。
1.编写cmakelist.txt文件,通过cmake生成makefile文件,make生成可执行文件、静态库、共享库。
2.cmake是一个跨平台的编译工具,可以用简单的语句来描述所有平台编译。make工具依赖于平台,gnu make,qt qmake,ms nmake,bsd pmake,makepp等等,这些不同make工具遵循不同的规范标准,所有执行的makefile文件格式格式不同。
在线帮助文档:https://cmake.org/documentation
3. cmake比configure优秀
configure也是跨平台编译工具,使用比较繁琐.configure脚本为了让一个程序能够在各种不同类型的机器上运行而设计的。在使用make编译源代码之前,configure会根据自己所依赖的库而在目标机器上进行匹配。约定俗成的,所有的configure脚本都把脚本文件名起为configure,一般来讲都是shell脚本,根据所在的系统环境生成makefile文件。有时候看到一些程序的configure内容超级之多,让人难以看下去。configure脚本运行时扫描当前环境,生成一个名为config.status的子脚本。子脚本将makefile.in文件转换为适应于当前系统环境的makefile文件。
gnu build system这个工具能够帮助我们生成configure脚本,又叫做autotools。autotools包含的命令有autoconf,automake,libtool。
二、cmakelists编写介绍
1.指定运行配置cmake最低版本: cmake_minimum_required(version 3.13)
2.设置工程名称: project(test) 获取${project_name}
3.设置变量: set(var 1) ${变量名}
4.获取系统环境变量:
$env{
系统变量} $env{
path}
5.指定可执行文件生成路径:
set(executable_output_path "xxx/bin")
6.指定输出动态库的目录位置:
set(library_output_path "xxx/lib")
7.获取源代码、头文件路径:
file(glob src_list "${project_source_dir}/src/*.cpp")
file(glob head_list "${project_source_dir}/include/*.h")
8.添加头文件路径:
include_directories("${project_source_dir}/include")
9.添加链接库路径:
link_directories("${project_source_dir}/lib")
10.添加生成可执行文件:
add_executable(${project_name} ${src_list} ${head_list})
11.链接库名:
target_link_libraries(${project_name} ${lib_name})
12.添加生成动态库或静态库: 不写默认静态库
add_library(${lib_name} shared ${project_source_dir}/third/test.cpp)
add_library(${lib_name}_static static ${project_source_dir}/third/test.cpp)
13.静态库的输出名称:
set_target_properties(${lib_name}_static properties output_name ${lib_name})
14.设置预处理宏开关 开启:
option(use_test "option for test" on)
15.配置一个头文件用于传递一些cmake中的配置到源代码中
configure_file("${project_source_dir}/config.in" "${project_source_dir}/config.h")
16.make install
16.1安装可执行文件、静态库、动态库。
install(targets myrun mylib mystaticlib
runtime destination ${cmake_install_bindir}
library destination ${cmake_install_libdir}
archive destination ${cmake_install_libdir} )
16.2安装整个目录
install(directory ${out_path} destination ${project_source_dir})
install(directory ${out_path} destination ${project_source_dir}
pattern "${exe_name}" permissions
owner_execute owner_read group_execute group_read world_execute world_read)
16.3安装文件
install(files "${project_binary_dir}/bin/${exe_name}" destination "${project_source_dir}/bin" pattern "${exe_name}" permissions owner_execute owner_read group_execute group_read world_execute world_read)
install(files "${project_binary_dir}/lib/lib${lib_name}.a" destination "${project_source_dir}/lib")
install(files "${project_binary_dir}/lib/lib${lib_name}.so" destination "${project_source_dir}/lib")
三、cmakelist构建qt工程
1.设置开启moc uic rcc编译器
set(cmake_include_current_dir on)
set(cmake_automoc on)
set(cmake_autouic on)
set(cmake_autorcc on)
set(cmake_cxx_flags "${cmake_cxx_flags} -fpic")
2.添加qt模块 添加头文件路径 依赖库路径 库名称 findxxx.cmake xxxconfig.cmake
find_package(qt5widgets config required)
target_link_libraries(${
project_name} qt5::widgets)
_found _include_dirs or _includes
_librarie or _libraries or _libs
_definitions
===================================
find_package(pkgconfig)
pkg_search_module(qt5widgets required qt5widgets)
target_link_libraries(${
project_name} ${
qt5widgets_libraries})
=====================================================
(pkg-config xxx a.默认usr/bin/*.pc b.读取环境变量pkg_config_path c.pkg-config --variable pc_path pkg-config )
(动态库 a.ld_library_path b./etc/ld.so.conf c./lib or /usr/lib)
四、cmakelist添加第三方库
1.编写编译安装脚本 命名为uchartdet_install.sh
cd libiconv-1.16
path=”`pwd`/../lib” #生成路径自己指定
./configure --enable-extra-encodings --prefix=$path --enable-static --disable-shared
make
make install
2.在第三方库third目录下编写cmakelist.txt
execute_process(command bash "${cmake_current_source_dir}/uchartdet_install.sh" working_directory ${
cmake_current_source_dir})
3.在上级cmakelist.txt添加add_subdirectory(third)
相关demo文档下载:https://download.csdn.net/download/wml00876/19671522
简单demo
#最低cmake版本
cmake_minimum_required(version 3.0)
#项目名
project(aqp)
#引入文件
file(glob heads "${cmake_current_source_dir}/*.hpp")
file(glob srcs "${cmake_current_source_dir}/*.cpp" "${cmake_current_source_dir}/*.qrc")
#添加qt模块
find_package(qt5core required)
find_package(qt5widgets required)
#创建可执行文件
add_executable(aqp
${
heads}
${
srcs}
)
#引用路径,包含编译给定目标时需要使用的目录
target_include_directories(${
project_name} public
${
qt5core_include_dirs}
${
qt5widgets_include_dirs}
)