cmake使用技巧

  1. shell给CMakeList.txt传参数

    • shell
      export ROOT_PATH=`pwd`
      
    • CMakeList.txt
      set(ROOT_PATH $ENV{ROOT_PATH})
      message("path:${ROOT_PATH}")
      
  2. 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@"
      
  3. 打包可执行程序的依赖库

    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
  4. 链接库的坑

    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})添加库的路径才能找到
    
  5. 解决错误: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
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值