cmake小结
Published:
本文介绍cmake 一些使用技巧。
cmake 设置rpath
第一步:在cmake开始时设置,让编译出来的动态库不要将编译时路径添加到RPATH中。
set(CMAKE_SKIP_RPATH TRUE)
第二步:在 add_library 之后,target_link_libraries 之前,设置下面的属性,让当前动态库查找依赖库时从 …/lib或者./lib查找。这样哪怕有多级依赖,最后我们打包可执行程序时,只需要将所有的动态库放到lib目录,可执行程序放到bin目录即可(可选)。–disable-new-dtags 的作用是不要使用run-path,统一使用rpath。
set_target_properties(gbbase PROPERTIES LINK_FLAGS "-Wl,--disable-new-dtags")
set_target_properties(gbbase PROPERTIES LINK_FLAGS "-Wl,-rpath=../lib:./lib")
configure 方式设置rpath 通过configure方式编译的动态库有其他依赖库,为了让参与当前编译的库和其依赖库都具有rpath属性。可以这样设置
./configure --prefix=${PWD}/build LDFLAGS=-Wl,-rpath=../lib:./lib
最终在部署时,只需要将库放到lib目录即可。
依赖传递
PUBLIC 可以将子模块的依赖传递给当前模块,避免当前模块引入二级依赖的头文件和库。但是一般情况下请尽量使用PRIVATE,避免依赖污染。 如:
target_include_directories(gbbase PUBLIC ${CMAKE_SOURCE_DIR}/src/base
${CMAKE_SOURCE_DIR}/src/controls
${CMAKE_SOURCE_DIR}/3rd
${CMAKE_SOURCE_DIR}/3rd/single_include)
target_link_libraries(gbbase PUBLIC Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Sql base controls)
include当前目录
set(CMAKE_INCLUDE_CURRENT_DIR ON)
文件递归搜索
file(GLOB_RECURSE Header_files "${CMAKE_CURRENT_SOURCE_DIR}/src/*.h")
file(GLOB_RECURSE Souce_files "${CMAKE_CURRENT_SOURCE_DIR}/src/*.c" "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
cmake添加自定义宏
1、命令行添加(有参)
-DDROP_COUNT=10
则在cmakelist.txt中这样判断
if(DEFINED DROP_COUNT)
message(DROP_COUNT: ${DROP_COUNT})
endif()
if(DEFINED DROP_COUNT)
add_definitions(-DDROP_COUNT=${DROP_COUNT})
message(DROP_COUNT: ${DROP_COUNT})
endif()
然后在代码中这样判断
#ifdef DROP_COUNT
int dropcount = DROP_COUNT;
#else
int dropcount = 15;
#endif
2、命令行添加(无参)
-DTEST_OUTPUT=ON
则在cmakelist.txt中这样判断
if(TEST_OUTPUT)
add_definitions(-DOPEN_TEST)
endif()
然后在代码中这样判断
#ifdef OPEN_TEST
#endif
指定程序输出路径
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/output/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/output/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/output/bin)
cmake 执行自定义脚本
execute_process(COMMAND sh build.sh "${CMAKE_SOURCE_DIR}/output"
WORKING_DIRECTORY 脚本路径
RESULT_VARIABLE SCRIPT_RESULT
OUTPUT_VARIABLE SCRIPT_OUTPUT)
message(STATUS "OUTPUT: ${SCRIPT_OUTPUT}")
message(STATUS "RESULT: ${SCRIPT_RESULT}")
在 ${CMAKE_SOURCE_DIR}/3rd/ddcutil-2.1.4-release/ 路径下,使用 sh 执行 build.sh 这个脚本,并给脚本传递参数: ${CMAKE_SOURCE_DIR}/output ,最后打印脚本的执行结果和输出。
