CMakeLists.txt例子, (使用eigen, opencv, pangolin, Sophus, Ceres)

7 篇文章 0 订阅

一个CMakeLists.txt例子
所在目录结构如下:

wfq@wfq:~/MyProjects/cmaketest$ tree .
.
├── CMakeLists.txt
├── cmake_module
│   └── FindHELLO.cmake
├── include
│   └── head.h
├── main.cpp
├── src
│   └── head.cpp
└── SubFolder
    └── CMakeLists.txt

CMakeLists.txt文件

cmake_minimum_required(VERSION 3.0)

project(ProjectName)

set(CMAKE_BUILD_TYPE "Release") //或"Debug"

set(CMAKE_CXX_FLAGS "-std=c++11(14)")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -g -Wall")

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)  #内置的可执行文件存放目录
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)    #内置的中间库文件存放目录

//#定义一个存放.cmake文件的目录,CMAKE_MODULE_PATH查找优先级最高
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_module)   #写个FindNAME.cmake文件自定义查找库
//#或添加.cmake文件目录
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_module)

find_package(HELLO REQUIRED)  //#根据cmake_module里的FindHELLO.cmake(示例见下面内容)查找的
message("hello.h is here:: ${HELLO_INCLUDE_DIRS}")  //#这个是目录,头文件所在目录
message("libhello.a(.so) is:: ${HELLO_LIBRARIES}")  //#这个是文件,库文件

AUX_SOURCE_DIRECTORY(dir VAR)  //#把dir中的源文件全部赋给变量VAR
//#例如 AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src SRC_DIR)
add_library(<libname> SRC_DIR)

//#生成链接库文件
add_library(<library_name> [SHARED|STATIC] src/head.cpp ...)  //#默认存放在当前地址,如build里

include_directories(${PROJECT_SOURCE_PATH}/include)  //#头文件目录
link_directories() //#链接库文件目录  取而代之的是find_package()里的find_library()

add_subdirectory(SubFolder)  //#添加子目录,里面必须有CMakeLists.txt文件

//#main.cpp是主程序,主程序才能生成可执行文件,而一般的源文件只能add_library()成库文件
add_executable(${PROJECT_NAME} main.cpp)
add_executable(${PROJECT_NAME} main.cpp src/head.cpp)//# 这样就不用链接了

//#为可执行文件或库文件链接库A B C(不带lib和后缀.a,.so的链接库文件)
target_link_libraries(<可执行文件或库文件> A B C)
//#如
target_link_libraries(${PROJECT_NAME} head ${OpenCV_LIBS})


********************************************************************************
//##使用eigen3,Pangolin,Sophus,OpenCV,Ceres,g2o

//# eigen3,只有头文件,只需要include_directories()头文件,没有target_link_libraries()库文件
include_directories("/usr/include/eigen3")

//# Pangolin
find_package(Pangolin REQUIRED)
include_directories(${Pangolin_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NEME} ${Pangolin_LIBRARIES})
//有时候Pangolin需要fmt依赖
target_link_libraries(${PROJECT_NAME} ${Pangolin_LIBRARIES} fmt)

//#Sophus  和eigen一样只有头文件
//!!!!!必须依赖eigen3.3以上版本
find_package(Sophus REQUIRED)
include_directories(${Sophus_INCLUDE_DIRS}/usr/include/eigen3")
//Sophus有时候需要fmt依赖
target_link_libraries(${PROJECT_NAME} fmt)
//很奇怪我的find_package(Sophus REQUIRED)之后,头文件和库文件变量啥也没有,因为直接装在/usr/local里了,所以我可以直接用Sophus,加一个target_link_libraries(${PROJECT_NAME} fmt)就可以了

//#OpenCV
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})

//#Ceres
find_package(Ceres REQUIRED)
include_directories(${CERES_INCLUDED_DIRS})
target_link_libraries(${PROJECT_NAME} ${CERES_LIBRARIES})

//#g2o 得自己写个FindG2O.cmake文件,才能像下面一样写
find_package(G2O REQUIRED)
include_directories($G2O_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${G2O_CORE_LIBRARY} ${G2O_STUFF_LIBRARY})

//#g20 直接法
include_directories("/usr/local/include/g2o")
target_link_libraries("usr/local/lib/<lib_name>")
//#如
target_link_libraries("/usr/local/lib/g2o_core")

FindHELLO.cmake文件

//#最小的可以实现查找头文件和库文件的.cmake文件
find_path(HELLO_INCLUDE_DIRS hello.h /usr/local/include
                                    /usr/include
                                    ~/MyProjects/HelloTest/include)  //#已知在这里

find_library(HELLO_LIBRARIES hello ~/MyProjects/HelloTest/build)  //#已知链接库文件libhello.a或.so在这里

if(HELLO_INCLUDE_DIR AND HELLO_LIBRARIES)
    set(HELLO_FOUND TRUE)
else()
    set(HELLO_FOUND FALSE)
endif()
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值