CMakeLists.txt链接库的基本套路

CMakeLists.txt链接库的基本套路

在使用CMake组织工程时,如果我们需要依赖某个库文件,需要完成以下步骤:

  1. 查找库文件(find_package命令)
  2. 判断是否找到库文件(XXX_FOUND标记),并包含头文件(include_directories命令)
  3. 链接库文件到目标(target_link_libraries命令)
    因此,库文件、头文件的名字(大小写)我们就要清楚的写明,不要混淆。我常用的库如OpenCV, catkin, Boost, Eigen等,其用法如下。常用的变量有:name_INCLUDE_DIRS, name_INCLUDE_DIR, NAME_INCLUDE_DIRS, NAME_INCLUDE_DIR; name_LIBS, NAME_LIBS, name_LIBRARIES, NAME_LIBRARIES等。

OpenCV

#查找OpenCV是否安装
find_package(OpenCV REQUIRED core highgui imgproc imgcodecs)
if (OPENCV_FOUND)
    message(STATUS "找到OpenCV:\"${OpenCV_INCLUDE_DIRS}\",ENABLE_OPENCV宏已打开")
    message(STATUS "找到OpenCV:\"${OpenCV_LIBS}\"")
    include_directories(${OpenCV_INCLUDE_DIRS})
    add_definitions(-DENABLE_OPENCV)
    list(APPEND LINK_LIB_LIST ${OpenCV_LIBS})
endif (OPENCV_FOUND)

Boost

#查找Boost是否安装
find_package(Boost REQUIRED COMPONENTS
        regex
        graph
        chrono
        thread
        system
        filesystem
        serialization)
if (Boost_FOUND)
    message(STATUS "找到Boost:\"${Boost_INCLUDE_DIRS}\",ENABLE_BOOST宏已打开")
    message(STATUS "找到Boost:\"${Boost_LIBRARIES}\"")
    include_directories(${Boost_INCLUDE_DIRS})
    add_definitions(-DENABLE_BOOST)
    list(APPEND LINK_LIB_LIST ${Boost_LIBRARIES})
endif (Boost_FOUND)

ROS catkin

#查找catkin是否安装
find_package(catkin REQUIRED COMPONENTS
        geometry_msgs
        roscpp
        tf
        )
if (catkin_FOUND)
    message(STATUS "找到catkin:\"${catkin_INCLUDE_DIRS}\",ENABLE_CATKIN宏已打开")
    message(STATUS "找到catkin:\"${catkin_LIBRARIES}\"")
    include_directories(${catkin_INCLUDE_DIRS})
    add_definitions(-DENABLE_CATKIN)
    list(APPEND LINK_LIB_LIST ${catkin_LIBRARIES})
endif (catkin_FOUND)

Eigen

Eigen比较特殊, Eigen采用源码的方式提供给用户使用,在使用时只需要包含Eigen的头文件即可进行使用。之所以采用这种方式,是因为Eigen采用模板方式实现,由于模板函数不支持分离编译,所以只能提供源码而不是动态库的方式供用户使用。

#查找Eigen3是否安装
find_package(Eigen3 REQUIRED)
if (EIGEN3_FOUND)
    message(STATUS "找到Eigen3:\"${EIGEN3_INCLUDE_DIR}\",ENABLE_EIGEN3宏已打开")
    include_directories(${EIGEN3_INCLUDE_DIR})
    add_definitions(-DENABLE_EIGEN3)
#     list(APPEND LINK_LIB_LIST ${EIGEN3_LIBRARIES})
endif (EIGEN3_FOUND)

参考博客https://zhuanlan.zhihu.com/p/73373016

<think>好的,用户想了解如何编写嵌套的CMakeLists.txt文件,特别是外层和src目录的配置方法。我需要先回忆一下CMake基本结构,以及如何处理多级目录的情况。根据之前的引用内容,特别是引用[1]提到主目录需要有CMakeLists.txt,并通过add_subdirectory添加子目录。引用[3]也提到让每个源文件目录都包含CMakeLists.txt,所以可能需要分层次的结构。 首先,外层CMakeLists.txt应该设置项目的基本配置,比如最低版本、项目名称、C++标准等。然后通过add_subdirectory(src)来包含src子目录。这时候src目录下的CMakeLists.txt需要负责编译源文件成可执行文件或库。根据引用[4],在src的CMakeLists.txt中,可能需要指定源文件,并链接库或者设置其他编译选项。 用户可能希望知道具体的配置步骤,比如外层如何调用子目录,子目录如何处理源文件。需要区分两种情况,一种是子目录有自己的CMakeLists.txt,另一种是没有的情况。但用户的问题明确提到嵌套的CMakeLists,所以应该是前者。 另外要注意的是,外层需要包含必要的头文件目录,比如include目录,可能需要使用include_directories命令。而子目录中的CMakeLists可能需要使用add_executable或add_library,并且可能需要链接到外层定义的库。 还要考虑变量的作用域,比如在外层定义的变量是否在子目录中可见。可能需要使用PARENT_SCOPE或者target_include_directories来传递包含路径。 可能还需要提到如何管理多个子目录,比如如果有lib和src两个子目录,外层如何分别处理。但用户的问题集中在src目录,所以重点放在外层和src的交互。 然后,示例代码的结构应该展示外层和src的CMakeLists.txt内容,比如外层设置项目,添加子目录,而src负责编译可执行文件。同时,引用中的例子,比如引用[4]中的demo,可能有用到include_directories和add_executable,可以借鉴。 最后,生成相关问题需要考虑用户可能的后续疑问,比如如何处理多个子目录、变量传递、静态库的创建等。</think>以下是如何配置嵌套CMakeLists.txt文件的逐步说明,通过分层管理实现C++工程结构: --- ### 嵌套CMakeLists.txt配置方法 #### 1. 外层CMakeLists.txt(项目根目录) ```cmake # 最低CMake版本要求 cmake_minimum_required(VERSION 3.10) # 项目名称及语言 project(MyProject CXX) # 设置C++标准 set(CMAKE_CXX_STANDARD 17) # 包含头文件目录 include_directories(${PROJECT_SOURCE_DIR}/include) # 添加子目录(自动查找子目录中的CMakeLists.txt) add_subdirectory(src) ``` #### 2. src目录CMakeLists.txt ```cmake # 收集所有源文件(递归匹配.cpp) file(GLOB_RECURSE SOURCES "*.cpp") # 生成可执行文件 add_executable(${PROJECT_NAME} ${SOURCES}) # 链接外部库(示例) target_link_libraries(${PROJECT_NAME} pthread) ``` #### 3. 目录结构示例 ``` MyProject/ ├── CMakeLists.txt # 外层配置 ├── include/ # 公共头文件 │ └── utils.h └── src/ ├── CMakeLists.txt # 内层配置 ├── main.cpp └── utils.cpp ``` --- ### 关键配置说明 1. **作用域控制**:外层`include_directories`会自动传递到子目录[^3] 2. **变量隔离**:子目录中定义的变量(如`SOURCES`)不会污染外层作用域 3. **构建类型控制**:建议在外层统一设置`CMAKE_BUILD_TYPE` 4. **多级嵌套**:可通过`add_subdirectory`实现三级以上目录管理[^1] --- ### 进阶技巧 - 使用`target_include_directories`替代全局include更规范 - 通过`aux_source_directory`收集源文件避免GLOB缺点 - 采用`CMAKE_CURRENT_SOURCE_DIR`保持路径相对性[^4] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值