C++编译之(3)-camke/CMakeLists.txt的编译使用教程

引言

上一节介绍了前面我们介绍了make/Makefile来对c++项目进行编译,我们继续以该项目为例讲解;

C++编译之(1)-g++单/多文件/库的编译
C++编译之(2)-make及makefile编译过程

我们先看看上一节的实战的目录结构如下:

- mutilFilesDemo
  - include // 头文件目录
    - HelloTools.h
    - Prints.h
  - libs // 库子项目目录
    - ToolLibs.h
    - ToolLibs.cpp
    - Makefile  // 子项目Makefile
  - src // 源码目录
    - module // 源码模块
      - Prints.cpp // Prints类
    - HelloTools.cpp // HelloTools类
  - main.cpp // main类
  - Makefile  // 主项目Makefile

make与Makefile,cmake与CMakeLists.txt

make用来编译c++项目,make命令根据Makefile中配置的编译链接关系;由于Makefile文件的制作是个大工程,因此出现了cmake工具cmake根据CMakeLists.txt来执行cmake命令;

使用CMake编写跨平台工程的流程如下:

(1)编写源文件

(2)编写CMakeLists.txt

(3)由CMake根据CMakeLists.txt来生成相应的makefile文件

(4)使用make并根据makefile调用gcc来生成相应的可执行文件

CMake是一个可以跨平台的编译工具,可以用简单的语句来描述所有平台的编译过程。他能够输出各种各样的 makefile 或者工程文件。和make与makefile类似,我们在使用CMake时同样也需要一个文件来提供规则,这个文件就是CMakeLists

CMakeLists.txt

编写CMakeLists.txt最常用的功能就是调用其他的.h头文件和.so/.a库文件,将.cpp/.c/.cc文件编译成可执行文件或者新的库文件。

# 指定cmake最小版本
cmake_minimum_required(VERSION 3.4.1)

# 本CMakeLists.txt的project名称
# 会自动创建两个变量,PROJECT_SOURCE_DIR和PROJECT_NAME 
# ${PROJECT_SOURCE_DIR}:本CMakeLists.txt所在的文件夹路径
# ${PROJECT_NAME}:本CMakeLists.txt的project名称
# CMAKE_BINART_DIR, PROJECT_BINARY_DIR, <projectName>_BINARY_DIR:这三个变量的含义一样。
project(xxx)

# 获取路径下所有的.cpp/.c/.cc文件,并赋值给变量中
aux_source_directory(路径 变量)

# 给文件名/路径名或其他字符串起别名,用${变量}获取变量内容
set(变量 文件名/路径/...)

# 添加编译选项
add_definitions(编译选项)

# 打印消息
message(消息)

# 编译子文件夹的CMakeLists.txt
add_subdirectory(./subProject) 

# 将.cpp/.c/.cc文件生成可执行文件
add_executable(main main.cpp)

# 将.cpp/.c/.cc文件生成.a静态库 // add_library(库文件名称 STATIC 文件)
# 注意,库文件名称通常为libxxx.so,在这里只要写xxx即可
# 生成静态库(默认) 
add_library(util STATIC util.cpp)
# 生成动态库
add_library(util SHARED util.cpp)

# 规定.h头文件路径
include_directories(路径)

# 规定.so/.a库文件路径
link_directories(路径)

# 对add_library或add_executable生成的文件进行链接操作
# 注意,库文件名称通常为libxxx.so,在这里只要写xxx即可
target_link_libraries(可执行文件名称 链接的库文件名称)
# 如果是链接的动态库,则运行的时候需要把它拷贝到可执行文件名称同目录下

如何设置DGB调试模式请看这里

CMakeLists的编写过程的方法

1. 指定 cmake 的最小版本
cmake_minimum_required(VERSION 3.4.1)
2.设置项目名
pr
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
解析以下错误:CMake Error at /Users/fym/Library/Application Support/JetBrains/Toolbox/apps/CLion/ch-0/232.8453.115/CLion 2023.2 EAP.app/Contents/bin/cmake/mac/share/cmake-3.26/Modules/CMakeTestCXXCompiler.cmake:60 (message): The C++ compiler "/usr/local/bin/g++-13" is not able to compile a simple test program. It fails with the following output: Change Dir: /Users/fym/Desktop/C++/cmake-build-debug/CMakeFiles/CMakeScratch/TryCompile-HWLOEj Run Build Command(s):/Users/fym/Library/Application Support/JetBrains/Toolbox/apps/CLion/ch-0/232.8453.115/CLion 2023.2 EAP.app/Contents/bin/ninja/mac/ninja -v cmTC_1dd3b && [1/2] /usr/local/bin/g++-13 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk -fdiagnostics-color=always -o CMakeFiles/cmTC_1dd3b.dir/testCXXCompiler.cxx.o -c /Users/fym/Desktop/C++/cmake-build-debug/CMakeFiles/CMakeScratch/TryCompile-HWLOEj/testCXXCompiler.cxx [2/2] : && /usr/local/bin/g++-13 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_1dd3b.dir/testCXXCompiler.cxx.o -o cmTC_1dd3b && : FAILED: cmTC_1dd3b : && /usr/local/bin/g++-13 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cmTC_1dd3b.dir/testCXXCompiler.cxx.o -o cmTC_1dd3b && : ld: unsupported tapi file type '!tapi-tbd' in YAML file '/Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk/usr/lib/libSystem.tbd' for architecture x86_64 collect2: error: ld returned 1 exit status ninja: build stopped: subcommand failed. CMake will not be able to correctly generate this project. Call Stack (most recent call first): CMakeLists.txt:2 (project) -- Configuring incomplete, errors occurred! [无法重新加载]
07-10

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值