最基础的CMake,包含生成可执行文件,指定C++标准、查找某个路径下的所有源文件、将可执行和库文件分别输出到指定目录、 编译生成动态库

最基础部分

将一个源代码文件生成可执行文件,只需要如下所示的 CMakeLists.txt 文件:

powershell 复制代码
#用于设定需要的最低版本的CMake,如果低于它将停止处理project并报告错误
cmake_minimum_required(VERSION 2.5)

# 设置项目名称
project(mymuduo)

SET(SRC_LIST main.cpp)

# 生成目标可执行文件
add_executable(${PROJECT_NAME} ${SRC_LIST})
  • add_executable
    创建名为的target,这个target在make的时候会编译为可执行文件。编译的源文件为[source1] [source2]...。根据平台的不同,编译后的可执行文件名可能为.exe或者。其输出路径在默认情况下和源文件的结构相匹配(例如源文件中CMakeLists.txt在subdir下,则默认的可执行文件也在编译路径的subdir下。默认的文件名基于取名。)

指定C++标准

powershell 复制代码
set(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} -rdynamic -O3 -fPIC -ggdb -std=c++11 -Wall -Wno-deprecated -Werror -Wno-unused-function -Wno-builtin-macro-redefined -Wno-deprecated-declarations")
  • CMAKE_CXX_FLAGS为CMake预定义的全局内建变量,可用于设置编译选项。直接使用set修改其值即可。也可以使用
    add_compile_options命令,它们的区别在与add_compile_options命令添加的编译选项是针对所有编译器的(包括c和c++编译器),而CMAKE_C_FLAGS或CMAKE_CXX_FLAGS变量则是分别只针对c和c++编译器。
  • $ENV{}用于获取环境变量
  • CXXFLAGS是C++编译器的编译选项。可以看成是gcc(或gcc同类编译器)编译命令的一部分。
  • -rdynamic编译选项通知链接器将所有符号添加到动态符号表中。
  • -O3是一个优化选项,告诉编译器优化代码。
  • -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码,即在产生的代码中,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
  • -ggdb选项使编译器生成gdb专用的更为丰富的调试信息。
  • -std=c++11设置为使用C++11标准。
  • -Wall选项告诉编译器 编译后显示所有警告。
  • -Wno-deprecated不要警告使用已弃用的功能。
  • -Werror告诉编译器视所有警告为错误,出现任何警告立即放弃编译。
  • -Wno-unused-function关闭函数被定义了但没有被使用而产生的警告,即不使用的函数不警告。
  • -Wno-builtin-macro-redefined如果某些内置宏被重新定义,请不要警告。
  • -Wno-deprecated-declarations关闭使用废弃API的警告。

查找在某个路径下的所有源文件

powershell 复制代码
aux_source_directory(< dir > < variable >)
  • <dir> 是想要搜索的目录, <variable> 是一个变量,用于存储找到的所有源文件的列表。搜集所有在指定路径下的源文件的文件名,将输出结果列表储存在指定的变量中。该命令主要用在那些使用显式模板实例化的工程上。模板实例化文件可以存储在Templates子目录下,然后可以使用这条命令自动收集起来;这样可以避免手工罗列所有的实例。

将可执行和库文件分别输出到指定目录

powershell 复制代码
# 设置静态库文件目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

# 动态库文件目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

# 可执行文件目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

编译生成动态库

powershell 复制代码
add_library(mymuduo STATIC/SHARED
        ${SRC_LIST}
        )
  • 此命令将使用add_library()调用中的源代码创建一个名为libmymuduo.a的静态库
    add_library: 生成动态库或静态库
    第1个参数指定库的名字;
    第2个参数决定是动态还是静态,如果没有就默认静态;
    第3个参数指定生成库的源文件。
相关推荐
mazo_command44 分钟前
【MATLAB课设五子棋教程】(附源码)
开发语言·matlab
IT猿手1 小时前
多目标应用(一):多目标麋鹿优化算法(MOEHO)求解10个工程应用,提供完整MATLAB代码
开发语言·人工智能·算法·机器学习·matlab
青春男大1 小时前
java栈--数据结构
java·开发语言·数据结构·学习·eclipse
88号技师1 小时前
几款性能优秀的差分进化算法DE(SaDE、JADE,SHADE,LSHADE、LSHADE_SPACMA、LSHADE_EpSin)-附Matlab免费代码
开发语言·人工智能·算法·matlab·优化算法
Zer0_on1 小时前
数据结构栈和队列
c语言·开发语言·数据结构
一只小bit1 小时前
数据结构之栈,队列,树
c语言·开发语言·数据结构·c++
一个没有本领的人2 小时前
win11+matlab2021a配置C-COT
c语言·开发语言·matlab·目标跟踪
一只自律的鸡2 小时前
C项目 天天酷跑(下篇)
c语言·开发语言
源码哥_博纳软云2 小时前
JAVA智慧养老养老护理帮忙代办陪诊陪护小程序APP源码
java·开发语言·微信小程序·小程序·微信公众平台
沐泽Mu2 小时前
嵌入式学习-QT-Day05
开发语言·c++·qt·学习