目录
例1 简单项目编译
目录结构
CMakeLists.txt
test1.cpp
编译命令
外部编译:
执行
例2 多目录编译
子目录CMakeListx.txt
主目录CMakeLists.txt
main.cpp
常见命令
cmake_minimum_required
project 设置项目名称
add_executable
例 1 直接使用文件
例 2 使用变量
例 3 指定目录搜索cpp文件
message 打印信息
add_subdirectory 添加子目录编译
add_library 编译成库文件
target_sources 确定那些源文件会编译进目标
例1:库文件编译
例2:可执行文件编译
set
常用常量
注意事项
在 CMakeLists.txt 中共享变量
大型项目
官网:
├── CMakeLists.txt
├── Calculator.cpp
├── Calculator.h
├── main.cpp
cmake_minimum_required(VERSION 3.0) project(BUILD)
set(SOURCES test.cpp) add_executable(test1 ${SOURCES})
注:
#include using namespace std;
int main(int argc, char const *argv[]) {
cout<<"hello world"<
mkdir build
cd build
cmake .
make
注:
./test1
cmake_minimum_required(VERSION 3.0)
project(VECTOR)
#c++标准
set(CMAKE_CXX_STANDARD 11)
#set(CMAKE_CXX_STANDARD_REQUIRED ON) 是一个CMake命令,它用于指定编译器是否应该强制使用所需的C++标准。将此命令设置为
#ON 将强制编译器使用所需的C++标准,如果编译器不支持所需的标准,则会引发错误。如果将其设置为
#OFF,则编译器会尝试使用所需的标准,但如果不支持,则会回退到较低的标准。
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 自动找出当前目录下的源文件(不包含子目录),并赋值给SOURCES变量
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/lib SOURCES)
# 生成共享库
add_library(vector_lib SHARED ${SOURCES})
#告知搜索的头文件路径 却是可以开放权限
target_include_directories(vector_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
cmake_minimum_required(VERSION 3.0)
project(MAIN)
# 通知子目录Vector的CMakeLists.txt 编译
add_subdirectory(Vector)
#生成二级制文件 main 源文件是main.cpp
add_executable(main main.cpp)
# 链接vector库文件
target_link_libraries(main PRIVATE vector_lib)
#include
#include "Vector.h"
using namespace std;
int main() {
Vector v1(1, 2, 3);
Vector v2(4, 5, 6);
Vector v3 = v1.add(v2);
std::cout << "v1: (" << v1.getX() << ", " << v1.getY() << ", " << v1.getZ() << ")" << std::endl;
std::cout << "v2: (" << v2.getX() << ", " << v2.getY() << ", " << v2.getZ() << ")" << std::endl;
std::cout << "v3 = v1 + v2: (" << v3.getX() << ", " << v3.getY() << ", " << v3.getZ() << ")" << std::endl;
return 0;
}
设置 cmake 的最新版本号,每个 CMakeLists.txt 文件首行必须包含
project( [VERSION ] [LANGUAGES ...])
project(projcetName VERSION 1.0)
其中,projectname 是项目的名称,version 是项目的版本号,language 是项目使用的编程语言。在 CMake 中,project 命令通常是作为 CMakeLists.txt 文件的第一条命令出现,用于定义项目的名称和版本号。该命令会自动创建一些变量,例如 PROJECT_NAME 和 PROJECT_VERSION
把一个或多个文件编译成一个可执行的二进制文件
add_executable(name1 test.cpp)
执行文件: ./name1
set(SOURCES test1.cpp test2.cpp ....)
add_executable(name1 ${SOURCES})
执行: ./name1
file(GLOB SOURCES src/*.cpp)
add_executable(my_program ${SOURCES})
执行:./my_program
示例中我们使用 file(GLOB ...) 命令从 src 目录中查找所有扩展名为 .cpp 的文件,并将它们存储在 SOURCES 变量中。然后,我们使用 add_executable 命令创建了一个名为 my_program 的可执行文件,并将 SOURCES 变量作为参数传递给该命令。这样,CMake 将会将这些文件编译成一个可执行文件。
project(my_project VERSION 1.0)
message("Project name: ${PROJECT_NAME}")
message("Project version: ${PROJECT_VERSION}")
add_subdirectory(test1)
注:子目录中需要含有 CMakeLists.txt
add_library( [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL]source1 [source2 ...])
add_library(mylib STATIC foo.cpp bar.cpp)
不使用 target_sources
# 定义一个名为 my_library 的库
add_library(my_library SHARED foo.cpp bar.cpp )
使用 target_sources
# 定义一个名为 my_library 的库 add_library(my_library SHARED) 将 foo.cpp 和 bar.cpp 添加到 my_library 中
target_sources(my_library PRIVATE foo.cpp bar.cpp)
# 定义一个名为 my_executable 的可执行文件
add_executable(my_executable main.cpp)
# 定义一个名为 my_executable 的可执行文件 add_executable(my_executable) 将 main.cpp 添加到 my_executable 中 target_sources(my_executable PRIVATE main.cpp)
target_link_libraries 链接库文件(静态库或动态库)
target_link_libraries(main PRIVATE vector_lib)
set(MY_STRING "Hello, world!")
set(MY_LIST "foo" "bar" "baz")
set(MY_BOOL TRUE)
(其也有作用域和访问权限,只可使用自身变量和自身所包含的子 CMakeLists.txt)
set(MY_STRING "Hello, world!")
message("${MY_STRING}")
#include
int main() {
std::cout << "${MY_STRING}" << std::endl;
std::cout << "CMAKE_CXX_FLAGS: " << CMAKE_CXX_FLAGS << std::endl;
return 0;
}
变量需要设置为缓存才可以跨区域访问
# 把 DIR_SRCS 追加到主目录定义的 ALL_SRCS 中 set(ALL_SRCS ${ALL_SRCS} ${SUB_DIR_SRC} CACHE INTERNAL "")
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} SUB_DIR_SRC)
注:
1,在当前的CMakeLists.txt 目录下,找到所有的源文件(无法找到子目录下的源文件),并给变量SUB_DIR_SRC
2,设置变量 ALL_SRCS 为缓存、访问权限是INTERNAL 、初始值 "" 空字符串。
而后方可在主目录下的CMakeLists.txt 中访问到改变量,其他子目录也可访问到。
在编译大型项目时,并不建议使用file命令、aux_source_directory命令。手动导入源文件列表编译效率更高。
CMake Reference Documentation — CMake 3.26.3 Documentation