最基础的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个参数指定生成库的源文件。
相关推荐
xuanzdhc2 小时前
Linux 基础IO
linux·运维·服务器
愚润求学2 小时前
【Linux】网络基础
linux·运维·网络
不想写bug呀2 小时前
多线程案例——单例模式
java·开发语言·单例模式
bantinghy2 小时前
Linux进程单例模式运行
linux·服务器·单例模式
我不会写代码njdjnssj3 小时前
网络编程 TCP UDP
java·开发语言·jvm
小和尚同志3 小时前
29.4k!使用 1Panel 来管理你的服务器吧
linux·运维
帽儿山的枪手3 小时前
为什么Linux需要3种NAT地址转换?一探究竟
linux·网络协议·安全
李少兄9 天前
解决OSS存储桶未创建导致的XML错误
xml·开发语言·python
阿蒙Amon9 天前
《C#图解教程 第5版》深度推荐
开发语言·c#
shadon1789 天前
回答 如何通过inode client的SSLVPN登录之后,访问需要通过域名才能打开的服务
linux