CMake入门

Posted yutianzuijin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMake入门相关的知识,希望对你有一定的参考价值。

在之前的工作中经常用Makefile来编译项目,但是最近需要阅读别人的项目需要用到CMake,在此记录一下CMake的入门级知识。

添加项目中所有的代码文件

aux_source_directory命令会查找指定目录下的所有源文件,然后将结果存进指定变量名。

#查找当前目录下的所有源文件
#并将名称保存到 DIR_SRCS 变量 
aux_source_directory(. DIR_SRCS)
#指定生成目标 
add_executable(Demo $DIR_SRCS)

注意:如果想从DIR_SRCS中排除某些文件,可以通过下述命令实现:

#对应前面的当前目录.
list(REMOVE_ITEM DIR_SRCS “./removed_file_name”)

给项目添加一个自编译库

1.在库目录中增加一个CMakeLists.txt文件,增加一行:

add_library(lib_name code.cxx)

默认会创建一个静态链接库。
2.上层引用的项目在自己的CMakeLists.txt中添加以下几行:

add_subdirectory(lib_dir)
#相当于	Makefile中的-l选项
target_link_libraries(project_name PUBLIC lib_name) 
#相当于给特定的target添加-I选项
target_include_directories(project_name PUBLIC “$PROJECT_SOURCE_DIR/lib_dir”)

给项目添加一个第三方库

在引用第三方库的CMakeLists.txt文件中添加三行:

#相当于Makefile中的-I选项
include_directories(lib_include_dir)
#相当于Makefile中的-L选项
link_directories(lib_dir)
#相当于Makefile中的-l选项
target_link_libraries(project_name lib_name)

注意:link_directories选项要放在add_executable选项之前,否则报错。

支持 gdb

让 CMake 支持 gdb 的设置也很容易,只需要指定 Debug 模式下开启 -g 选项:

set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENVCXXFLAGS -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENVCXXFLAGS -O3 -Wall")

之后可以直接对生成的程序使用 gdb 来调试。

设置编译器和编译选项

默认情况下不需要设置编译器,特殊情况下可以通过修改CMAKE_C_COMPILER和CMAKE_CXX_COMPILER达到修改编译器的目的。特别地,如果希望所有的.c文件用g++编译,可以执行set(CMAKE_C_COMPILER g++)将gcc编译器替换为g++编译器。
编译选项的设置通过CMAKE_C_FLAGS和CMAKE_CXX_FLAGS来实现。当代码中包含.c和.cpp代码时记得两个变量都要设置。

设置可执行文件和库的生成目录

默认情况下,可执行文件和库都生成在Makefile所在的目录,可以通过EXECUTABLE_OUTPUT_PATH 和LIBRARY_OUTPUT_PATH来修改生成的位置。

让Makefile显示更多信息

通常用cmake生成的Makefile在编译过程中只显示一个进度,可以通过设置变量CMAKE_VERBOSE_MAKEFILE为on来让Makefile在编译的时候打印所有的编译选项。

以上是关于CMake入门的主要内容,如果未能解决你的问题,请参考以下文章

cmake从入门到放弃

CMake入门

CMake简易入门

CMake入门实践 什么是cmake

CMake 快速入门

CMake 快速入门