2.使用conan进行包管理-CMake项目配置

cmake文档: find_package — CMake 4.3.0 文档 - CMake 构建系统

1. 升级gcc版本

目前系统自带的gcc为8,可以将gcc升级到14(gcc-14.1.0.tar.bz2)。注意:不要使用编译好的gcc-14.1.0.bin.tar.xz文件。

1
2
3
4
5
6
7
# 解压文件
tar -zxvf gcc-14.1.0.tar.gz2
# 配置编译参数
cd gcc-14.1.0
./configure --disable-multilib --enable-languages=c,c++,fortran --enable-checking=release --disable-libstdcxx-pch --enable-libgomp --enable-lto --enable-gold --with-plugin-ld=gold --prefix=/home/<用户名>/tools/gcc-14
# 编译
make && make install

注:编译过程比较漫长

修改环境变量

1
2
3
4
# 修改用户环境变量
vim ~/.bashrc
export PATH=$HOME/tools/gcc-14/bin:$PATH
export LD_LIBRARY_PATH=/home/<用户名>/tools/gcc-14/lib64

可能遇到的问题:配置完成后,通过gcc命令可以看到版本已经升级到14.1.0,但是cmake执行的时候依然是8.5.0

解决办法:

1
2
cd $HOME/tools/gcc-14/bin
ln -s gcc cc

2. conan与cmake配合使用

2.1. 添加conanfile.txt

1
2
3
4
5
6
7
8
9
10
11
12
[requires]
amqp-cpp/4.3.26
security/1.0.2.0
redis-plus-plus/1.3.12
cppzmq/4.10.0
[generators]
CmakeDeps
CmakeToolchain
VirtualBuildEnv
VirtualRunEnv
[layout]
cmake_layout

2.2. 下载依赖库

通过conan命令下载conanfile.txt中的依赖库

1
2
3
# 这里有个约定,在项目中需要建一个depends文件夹
# conan拉取依赖生成的FindXX.cmake、相关脚本都放到depends目录下
conan install . --output-folder=./depends --build=missing --profile:host=rht_810

这里需要留意一下:conan install命令的输出内容,里面包含的find_package、target_link_libraries的固定写法,否则后面cmake编译工程的时候会出现找不到依赖库的错误。

2.3. cmake配置

主CMakeList.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
cmake_minimum_required(VERSION 3.15)
PROJECT(TSP)

set(LPI_BUILD_OS "redhat8.10")
cmake_host_system_information(RESULT PRETTY_NAME QUERY DISTRIB_PRETTY_NAME)
message(STATUS "${PRETTY_NAME}")
if (${PRETTY_NAME} MATCHES "8.10")
set(LPI_BUILD_OS "redhat8.10")
endif ()

set(LPI_ARCH x86_64)

ADD_DEFINITIONS(-D__FILE__="???")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -s")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall")

if (${CMAKE_BUILD_TYPE} MATCHES "Release")
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/Release)
else ()
SET(EXECUTABL_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/Debug)
ADD_DEFINITIONS(-DDEBUG)
endif ()

if (TIEKE)
ADD_DEFINITIONS(-DTIEKE)
endif ()

add_compile_options(-w)

# 追加依赖库camke文件的搜索路径(配合conan install命令)
# 这里需要注意一下depends/build/Release/generators这个路径,为什么是Release,看一下conan profile就明白
# 当然这里的cmake编译也是Release版本
# 如果需要编译输出Debug版,建议增加一个Debug类型的conan profile
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/depends/build/Release/generators)
include(${CMAKE_MODULE_PATH}/conan_toolchain.cmake)

# 检查依赖库是否存在,每个库的具体写法参考conan install 命令输出
find_package(security)
find_package(shift)
find_package(redis++)
...

# 添加依赖库头文件路径
# 格式: <库名称>_INCLUDE_DIRS,<库名称>使用find_package中的名称
include_directories(
${security_INCLUDE_DIRS}
${shift_INCLUDE_DIRS}
${redis++_INCLUDE_DIRS}
${sqlcipher_INCLUDE_DIRS}
...
)
# 具体写法参考conan install 命令输出
target_link_libraries(
${EXEC}
LibXml2::LibXml2
ZLIB::ZLIB
protobuf::protobuf
libzmq-static
log4cxx
libpqxx::pqxx
fmt::fmt
pthread
)

3. 完整的示例

3.1. conanfile.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[requires]
amqp-cpp/4.3.26
security/1.0.2.0
redis-plus-plus/1.3.12
cppzmq/4.10.0
[generators]
CmakeDeps
CmakeToolchain
VirtualBuildEnv
VirtualRunEnv
[layout]
cmake_layout

[options]
amqp-cpp/*:shared=True # 表示使用动态库

3.2. 根目录CmakeList.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
cmake_minimum_required(VERSION 3.15)
PROJECT(TSP)

set(LPI_BUILD_OS "redhat8.10")
cmake_host_system_information(RESULT PRETTY_NAME QUERY DISTRIB_PRETTY_NAME)
message(STATUS "${PRETTY_NAME}")
if (${PRETTY_NAME} MATCHES "8.10")
set(LPI_BUILD_OS "redhat8.10")
endif ()

set(LPI_ARCH x86_64)

ADD_DEFINITIONS(-D__FILE__="???")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -s")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall")

if (${CMAKE_BUILD_TYPE} MATCHES "Release")
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/Release)
else ()
SET(EXECUTABL_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/Debug)
ADD_DEFINITIONS(-DDEBUG)
endif ()

if (TIEKE)
ADD_DEFINITIONS(-DTIEKE)
endif ()

add_compile_options(-w)

# conan install . --output-folder=./depends --build=missing --profile:host=rht_810

# 追加依赖库camke文件的搜索路径(配合conan install命令)
# 这里需要注意一下depends/build/Release/generators这个路径,为什么是Release,看一下conan profile就明白
# 当然这里的cmake编译也是Release版本
# 如果需要编译输出Debug版,建议增加一个Debug类型的conan profile
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/depends/build/Release/generators)
include(${CMAKE_MODULE_PATH}/conan_toolchain.cmake)

# 检查依赖库是否存在,每个库的具体写法参考conan install 命令输出
find_package(security)
find_package(shift)
find_package(redis++)
...

# 添加依赖库头文件路径
# 格式: <库名称>_INCLUDE_DIRS,<库名称>使用find_package中的名称
include_directories(
${security_INCLUDE_DIRS}
${shift_INCLUDE_DIRS}
${redis++_INCLUDE_DIRS}
${sqlcipher_INCLUDE_DIRS}
)
# 具体写法参考conan install 命令输出
target_link_libraries(
${EXEC}
LibXml2::LibXml2
ZLIB::ZLIB
protobuf::protobuf
libzmq-static
log4cxx
libpqxx::pqxx
fmt::fmt
pthread
)
add_subdirectory(./analysis_node)
...
add_subdirectory(<子目录名称>)

3.3. 子项目CmakeList.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
set(SRC
./src/main.cpp
./src/<文件名称>
../common/<文件名称>
)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
include_directories(
../upgrade_client
../common
)
set(EXEC upgrade_client)
add_executable(${EXEC} ${SRC})

target_link_libraries(${EXEC}
LibXml2::LibXml2
libzmq-static
log4cxx
libpqxx::pqxx
shift::shift
security::security
pthread
)

4. 下载依赖/编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 下载依赖
conan install ./conanfile.txt --output-folder=./depends --deployer-package="*" --profile:host=redhat
# 此命令会在当前目录下生成depends/build目录,安装信息保存在depends/build目录下
# 如果当前目录中不存在conanfile.txt,则需要指定conanfile.txt的路径
# 如果使用的自定义包规定了包存放的位置,需要添加参数--deployer-package="*",将这些包从 Conan 缓存复制到用户的指定文件夹中

# 编译
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release # 会在当前目录下自动生成build目录,并将信息保存在此目录下
cd build # 进入build目录
cmkae --build . --config Release # 执行构建


# 如果能正常下载,建议创建一个lockfile固定版本:
1. 首次创建lockfile
首次构建成功时,使用conan install . --lockfile-out=conan.lock 生成lockfile
2. 把lockfile上传到github,与conanfile.txt在同级目录
3. 后续使用锁文件
后续构建时,使用conanfile install . --lockfile=conan.lock 指定lockfile

2.使用conan进行包管理-CMake项目配置
https://zxdong.cn/2026/08/21/技术/C++/2-使用conan进行包管理-CMake项目配置/
作者
zxdy
发布于
2026年8月21日
许可协议