Administrator
发布于 2025-05-16 / 15 阅读
0
0

CMake

语法

  • target_include_directories(hearDirs) //添加头文件搜索路径

  • add_executable(exeFileName src1.cpp src2.cpp ....) //指定要生成的可执行文件和其源文件

  • find_package(BOOST 1.70 REQUIRED) | find_library(varName libName /path/to/xxlib)

    • //查找cmake的库 find_package(BOOST 1.7.0 REQUIRED PATHS /path/to/boost)

    • 普通库查找find_library(MyLib NAMES mymath PATHS /opt/lib)

  • target_link_libraries(exeFileName library1 library2 ...) //链接目标文件和其他库

  • set(varName value) //设置变量 ,使用方式:${varName}

  • add_library(libname STATIC libsrc1.cpp libsrc2.cpp ....) //创建一个动态SHARED|静态库STATIC 指定包含的源文件

  • 其他

  • EXECUTABLE_OUTPUT_PATH 二进制可执行文件目录

    • set(EXECUTABLE_OUTPUT_PATH,${PROJECT_SOURCE_PATH}/bin) //设置exe到bin目录下

  • PROJECT_SOURCE_PATH 项目根目录

  • LIBRARY_OUTPUT_PATH 库目录

    • set(EXECUTABLE_OUTPUT_PATH,${PROJECT_SOURCE_PATH}/libbin) //设置exe到libbin目录下

  • add_subdirectory(dir) 多个CMakeLists文件情况下,外层文件控制全局,通过该方法控制内层文件运行

  • ./path/to 相对路径是相对该CMakeLists.txt文件而言

  • Windows端可能需要添加 target_link_libraries(xxx setupapi.lib) 提供相关库来使用函数

实例1(添加库)

	cmake_minimum_required(VERSION 3.10)
	project(MyProject CXX)

	# 查找 Boost 库
	find_package(Boost REQUIRED)

	# 添加源文件
	add_executable(MyExecutable main.cpp)

	# 链接 Boost 库
	target_link_libraries(MyExecutable Boost::Boost)

实例2(可执行文件使用库)

项目结构图
MyProject/
├── CMakeLists.txt
├── src/
│   ├── main.cpp
│   └── mylib.cpp
└── include/
    └── mylib.h

目标:生成一个lib,一个可执行程序(使用该lib)

CMakeLists.txt代码如下
cmake_minimum_required(VERSION 3.10)   # 指定最低 CMake 版本

project(MyProject VERSION 1.0)          # 定义项目名称和版本

# 设置 C++ 标准为 C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 添加头文件搜索路径
include_directories(${PROJECT_SOURCE_DIR}/include)

# 添加源文件
add_library(MyLib src/mylib.cpp)        # 创建一个库目标 MyLib
add_executable(MyExecutable src/main.cpp)  # 创建一个可执行文件目标 MyExecutable

# 链接库到可执行文件
target_link_libraries(MyExecutable MyLib)

实例3(多源文件处理)

cmake_minimum_required(VERSION 3.10)   # 指定最低 CMake 版本

project(MyProject VERSION 1.0)          # 定义项目名称和版本
# 设置 C++ 标准为 C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

#设置多源文件变量
set(SRC_LIST 
  ./src1.cpp
  ./src2.cpp
  ./src3.cpp)

# 添加头文件搜索路径
target_include_directories(MyExecutable ${PROJECT_SOURCE_DIR}/include)
add_executable(MyExecutable ${SRC_LIST})

实例4(生成库)

MyProject/
├── CMakeLists.txt
├── src/
│   └── mylib1.cpp
└── include/
    └── mylib.h

cmake_minimum_required (VERSION 3.5)

project (demo)

set (SRC_LIST ${PROJECT_SOURCE_DIR}/src/mylib1.cpp)

add_library (testFunc_shared SHARED ${SRC_LIST})

add_library (testFunc_static STATIC ${SRC_LIST})

set_target_properties (testFunc_shared PROPERTIES OUTPUT_NAME "testFunc")
set_target_properties (testFunc_static PROPERTIES OUTPUT_NAME "testFunc")

set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

实例5(多module)

MyProject/
├── CMakeLists.txt
├── main/
│   └── CMakeLists.txt
│   └── src
|        └──xx.cpp
│   └── include
|        └──xx.h
├── fmodule1/
│   └── CMakeLists.txt
│   └── src
|        └──func1.cpp
│   └── include
|        └──func2.h
└── lib/
    └── fmodule1生成的so,a

主CMakeLists.txt
-----------------------------------------------------------
cmake_minimum_required(VERSION 3.10.0)
project(demo5 VERSION 0.1.0 LANGUAGES C CXX)
# add_subdirectory(${PROJECT_SOURCE_DIR}/modulefunc1/)
add_subdirectory(${PROJECT_SOURCE_DIR}/main/)
-----------------------------------------------------------


fmodule1 CMakeLists.txt
----------------------------------------------------------
set(MF1_SRC_LIST 
    ./src/func1.cpp
    ./src/func2.cpp)

add_library(mfc1 SHARED ${MF1_SRC_LIST})
include_directories( ./include)

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib/)
----------------------------------------------------------

main CMakeLists.txt
----------------------------------------------------------
set(MAIN_SRC_LIST 
    ./src/main.cpp)
#头文件
include_directories(./include)
include_directories(${PROJECT_SOURCE_DIR}/modulefunc1/include)

#库设置
find_library(LIB_MODULE_FUNC1 NAMES mfc1 PATHS ${PROJECT_SOURCE_DIR}/lib)

add_executable(MM ${MAIN_SRC_LIST})
target_link_libraries(MM ${LIB_MODULE_FUNC1})
----------------------------------------------------------


评论