-
shell给CMakeList.txt传参数
- shell
export ROOT_PATH=`pwd`
- CMakeList.txt
set(ROOT_PATH $ENV{ROOT_PATH}) message("path:${ROOT_PATH}")
- shell
-
CMakeList.txt给C代码传版本号
- CMakeList.txt
set(APP_VERSION "1.0.0") configure_file("${CMAKE_SOURCE_DIR}/config.h.in" "${CMAKE_BINARY_DIR}/config.h")
- config.h.in
#cmakedefine APP_VERSION "@APP_VERSION@"
- CMakeList.txt
-
打包可执行程序的依赖库
set(APP_VERSION "1.0.0") #设置版本号到变量 set(APP_TARGET app) #设置可执行程序名到变量 set(CMAKE_INSTALL_RPATH "../lib") #设置用于指定make install生成的lib and exec files的runtime path(LD链接路经,多个rpath使用“:”分隔) set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install/${APP_TARGET}-${APP_VERSION}) #设置安装路径 add_executable(${APP_TARGET} main.cpp) #生成可执行程序 install(TARGETS ${APP_TARGET} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) #安装可执行程序 set(DEPLOY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/app.conf #设置可执行程序依赖的配置文件到变量 ) install(FILES ${DEPLOY_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) #安装可执行程序依赖配置文件 #安装可执行程序的依赖库[开始] #主要是GET_RUNTIME_DEPENDENCIES可以深层遍历查找依赖关系,主要可以看官方文档,应该是3.16版本开始支持 install(CODE [[ file(GET_RUNTIME_DEPENDENCIES RESOLVED_DEPENDENCIES_VAR RESOLVED_DEPS UNRESOLVED_DEPENDENCIES_VAR UNRESOLVED_DEPS EXECUTABLES ${CMAKE_INSTALL_PREFIX}/bin/app #不能用${APP_TARGET},会为空,不知道为啥 ) foreach(DEP_LIB ${RESOLVED_DEPS}) # file(INSTALL ${DEP_LIB} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) #TODO: install is soft link execute_process(COMMAND cp ${DEP_LIB} ${CMAKE_INSTALL_PREFIX}/lib) #cp指令直接拷贝的软链接的源文件 endforeach() ]]) #安装可执行程序的依赖库[结束]
- 搜索.so的优先级顺序
- RPATH: 写在elf文件中
- LD_LIBRARY_PATH: 环境变量
- RUNPATH: 写在elf文件中
- ldconfig的缓存: 配置/etc/ld.conf*可改变
- 默认的/lib, /usr/lib
- 搜索.so的优先级顺序
-
链接库的坑
target_link_libraries 强制链接静态库时 比如:zmq如果该库是安装到系统 target_link_libraries(app PUBLIC zmq) 能找到 target_link_libraries(app PUBLIC libzmq.a) 能找到 比如:zmq是通过add_subdirectory(zmq)子项目编译出来的静态库 target_link_libraries(app PUBLIC zmq) 能找到 target_link_libraries(app PUBLIC libzmq.a) 找不到 需要:link_directories(${CMAKE_BINARY_DIS/zmq})添加库的路径才能找到
-
解决错误:error adding symbols: DSO missing from command line
set(CMAKE_EXE_LINKER_FLAGS "-Wl,-copy-dt-needed-entries") #这是binutils在2.22版本以后,默认把–no-copy-dt-needed-entries这个选项打开了。当打开了这个选项的时候,编译器在链接的时候是不会递归的去获取依赖动态库的依赖项的,于是就会出现上述的问题。改用:-copy-dt-needed-entries
cmake使用技巧
于 2023-04-03 15:09:41 首次发布