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
|
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)
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/depends/build/Release/generators) include(${CMAKE_MODULE_PATH}/conan_toolchain.cmake)
find_package(security) find_package(shift) find_package(redis++) ...
include_directories( ${security_INCLUDE_DIRS} ${shift_INCLUDE_DIRS} ${redis++_INCLUDE_DIRS} ${sqlcipher_INCLUDE_DIRS} ... )
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)
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/depends/build/Release/generators) include(${CMAKE_MODULE_PATH}/conan_toolchain.cmake)
find_package(security) find_package(shift) find_package(redis++) ...
include_directories( ${security_INCLUDE_DIRS} ${shift_INCLUDE_DIRS} ${redis++_INCLUDE_DIRS} ${sqlcipher_INCLUDE_DIRS} )
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
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release cd build cmkae --build . --config Release
1. 首次创建lockfile 首次构建成功时,使用conan install . --lockfile-out=conan.lock 生成lockfile 2. 把lockfile上传到github,与conanfile.txt在同级目录 3. 后续使用锁文件 后续构建时,使用conanfile install . --lockfile=conan.lock 指定lockfile
|