1、在CMakeLists.txt中经常用到: add_subdirectory(),单独编译子模块,

    但是主模块经常依赖子模块的编译结果,通常为库,此时如果用make  -j8 并行编译方式,很可能出现编译错误,

原因就是主模块、子模块并行编译,当主模块先完成编译去链接子模块的库时,找不到目标库,而出现链接失败。



2、解决方法

        add_dependencies() 对主模块的目标添加子模块的目标作为依赖,这样就能保证子模块优先主模块编译,例子如下:



add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/livox_ros_driver/)

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/ceres-solver-2.0.0/)

add_dependencies(li_init  livox_sdk_static  ceres  )  #控制CMake编译顺序,解决库依赖问题


li_init: 主模块的目标,add_executable(li_init,src/laserMapping.cpp...)

livox_sdk_static: 子模块1的目标, 在子目录下的CMakeLists.txt中可以找到: add_library(${SDK_LIBRARY} STATIC "")

ceres: 子模块2的目标,在子目录下的CMakeLists.txt中可以找到: add_library(ceres STATIC "")





标签: none

评论已关闭