菜鸟笔记
提升您的技术认知

cmakelist使用总结-ag真人游戏

一、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}                                                                                    
)                             
网站地图