CMakeLists.txt详解

cmake 命令
CMakeLists.txt详解_第1张图片

CMake安装库到系统文件夹并被find_package找到

#声明使用的最低版本
cmake_minimum_required(VERSION 3.0)

# 指定工程名
PROJECT (HELLO)

# 现阶段,你只需要了解 SET 指令可以用来显式的定义变量即可
# 将 hello.cpp 赋值给 SRC_LIST 变量,也可以指定多个源文件,用空格隔开
# SET(SRC_LIST test01.cpp test02.cpp sub.cpp hello.cpp)
SET(SRC_LIST hello.cpp)

##使用MESSAGE向屏幕输出信息,STATUS表示在输出前添加这两根"--"
# 输出打印构建目录
MESSAGE(STATUS "This is HELLO_BINARY_DIR " ${HELLO_BINARY_DIR})
# 输出打印资源目录
MESSAGE(STATUS "This is HELLO_SOURCE_DIR " ${HELLO_SOURCE_DIR})
# 输出打印资源目录,与HELLO_SOURCE_DIR 一样 
MESSAGE(STATUS "This is PROJECT_SOURCE_DIR " ${PROJECT_SOURCE_DIR})
# 输出打印 CMake 资源目录,与 PROJECT_SOURCE_DIR 一样 
MESSAGE(STATUS "This is CMAKE_SOURCE_DIR " ${CMAKE_SOURCE_DIR})

# 如果想生成静态库,使用下面的语句
add_library(mymath mymath.cc)
# 如果想生成动态库,使用下面的语句
add_library(mymath SHARED mymath.cc)
#把多个源文件生成一个库文件
#add_library(test004 SHARED src/test01.cpp src/test02.cpp)
add_library(test004 src/test01.cpp src/test02.cpp)

#用来查找依赖包的,理想情况下,一句find_package()把一整个依赖包的头文件包含路径、库路径、库名字、版本号
#等情况都获取到,后续只管用就好了。但实际中往往CMake失败就是出在find_package()的失败上
#使用find_package()找包会自动查找FindXXX.cmake或XXXConfig.cmake文件;find_package 有两种模式,Module模式和Config模式;CMake默认采取Module模式,如果Module模式未找到库,才会采取Config模式。
#Module模式:搜索CMAKE_MODULE_PATH指定路径下的FindXXX.cmake文件,执行该文件从而找到XXX库。其中,具体查找库并给XXX_INCLUDE_DIRS和XXX_LIBRARIES两个变量赋值的操作由FindXXX.cmake模块完成。
#Config模式:搜索XXX_DIR指定路径下的XXXConfig.cmake文件,执行该文件从而找到XXX库。其中具体查找库并给XXX_INCLUDE_DIRS和XXX_LIBRARIES两个变量赋值的操作由XXXConfig.cmake模块完成。
#参考链接:[如何找到一个CMake包和ROS包作为依赖](https://www.jianshu.com/p/c9a0288aff8a)
# 如果你的项目需要依赖其他的库,可以使用下面语句,用法与find_package相同
# find_dependency(MYDEP REQUIRED)

#catkin_package函数解析package.xml文件,提取出里面的参数,由这些参数给find_package和pkg-config
#生成对应的配置文件;它自动的根据依赖关系把依赖的程序的头文件和链接库目录加入到当前的变量中。
#由catkin_package生成的文件最终会被安装到devel和build文件夹下。
catkin_package(
  INCLUDE_DIRS include
  CATKIN_DEPENDS cloud_msgs
  DEPENDS PCL
)


#向工程添加多个特定的头文件搜索路径
include_directories(
	include
	${catkin_INCLUDE_DIRS}
	${PCL_INCLUDE_DIRS}
	${OpenCV_INCLUDE_DIRS}
	${GTSAM_INCLUDE_DIR}
)#头文件路径.包含头文件所在目录

#向工程添加多个特定的库文件搜索路径
link_directories(
	include
	${OpenCV_LIBRARY_DIRS}
	${PCL_LIBRARY_DIRS}
	${GTSAM_LIBRARY_DIRS}
)

# 生成可执行文件 hello ,${SRC_LIST}是引用变量,也就是源文件 hello.cpp
#ADD_EXECUTABLE(hello ${SRC_LIST})
#add_executable(main main.cpp)
#把main1.cpp main2.cpp main3.cpp生成生成可执行文件 main
add_executable(main main1.cpp main2.cpp main3.cpp)

#为可执行文件main添加需要链接的库
#target_link_libraries(main test004.so) 
target_link_libraries(main test004.so test005.a) 


#将库hello 共享库hello_shared 安装到usr/local/lib文件夹下
INSTALL( TARGETS hello hello_shared 
LIBRARY DESTINATION lib 
ACHIVE DESTINATION lib)

#把头文件安装到指定目录
INSTALL(FILES libHelloSLAM.h DESTINATION include/libHelloSLAM)

#**install 讲解**
AUX_SOURCE_DIRECTORY(. all_sources)#将当前目录(.)下的所有源文件(c或者cpp)加入到变量all_sources中
 
ADD_LIBRARY(core_static ${all_sources})#我们期望使用变量all_sources中的文件去生成一个archive文件core_static
SET_TARGET_PROPERTIES(core_static PROPERTIES OUTPUT_NAME "core")#为这个archive文件设置一个命令
                                                                #(设置了之后,生成的文件名就是libcore.a而不是libcore_static.a)
INSTALL(TARGETS core_static #可以在core_static后面以空格添加多个目标
	RUNTIME DESTINATION bin #如果目标TARGETS中的某个目标是2进制可执行程序,就安装到${CMAKE_INSTALL_PREFIX}/bin
	LIBRARY DESTINATION lib #如果目标TARGETS中的某个目标是动态库so,就安装到${CMAKE_INSTALL_PREFIX}/lib
	ARCHIVE DESTINATION libstatic #如果目标TARGETS中的某个目标是静态库archive,就安装到${CMAKE_INSTALL_PREFIX}/libstatic
)#在执行make install命令后,将期望的文件安装到期望的目录中去
 #CMAKE_INSTALL_PREFIX的值是什么?请看下文
INSTALL(FILES core.h DESTINATION include)#同上,${CMAKE_INSTALL_PREFIX}/include


以下来自参考链接:https://www.zhihu.com/column/c_200294809
CMakeLists.txt详解_第2张图片

你可能感兴趣的:(Linux,c++)