第一个CMake项目(单个源文件项目)
-
linux安装CMake
-
创建Demo01文件夹
-
文件夹下创建
main.cpp
-
创建
CMakeLists.txt
文件# CMake 最低版本号要求 cmake_minimum_required (VERSION 3.13) # 项目信息 project (Demo1) # 指定生成目标 add_executable(Demo main.cpp)
-
在当前目录下执行
cmake .
命令生成makefile
如果出现错误:
No CMAKE_CXX_COMPILER could be found.
可以通过下面命令修改
sudo apt-get update sudo apt-get install -y build-essential
-
执行
make
命令生成可执行文件 -
运行可执行脚本即可
-
cmake_处理报警信息
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-write-strings")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-return-type")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-sign-compare")
多个源文件项目
1.多个源文件在同一个目录下面
唯一需要修改的就是CMakeList.txt
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo2)
# 指定生成目标
add_executable(Demo main.cpp utils.cpp)
由于源文件可能很多
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo2)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_executable(Demo ${DIR_SRCS})
##2.多个源文件在不同的目录下面
├── main.cpp
└── utils
├── utils.cpp
└── utils.h
-
第一种方式:
# CMake 最低版本号要求 cmake_minimum_required (VERSION 2.8) # 项目信息 project (Demo2) # 指定生成目标 add_executable(Demo main.cpp utils/utils.cpp)
-
多个
CMakeLists.txt
文件-
utils
目录下的CMakeLists.txt
# 查找当前目录下的所有源文件 # 并将名称保存到 DIR_LIB_SRCS 变量 aux_source_directory(. DIR_LIB_SRCS) # 生成链接库 add_library (utils ${DIR_LIB_SRCS})
-
main.cpp
目录下的CMakeLists.txt
文件# CMake 最低版本号要求 cmake_minimum_required (VERSION 2.8) # 项目信息 project (Demo4) # 查找当前目录下的所有源文件 # 并将名称保存到 DIR_SRCS 变量 aux_source_directory(. DIR_SRCS) # 添加 utils 子目录 add_subdirectory(utils) # 指定生成目标 add_executable(Demo main.cpp) # 添加链接库 target_link_libraries(Demo utils)
-
cmake编译安装
cmake ..
make
make install
配置文件
# 设置安装的文件夹
set(CMAKE_INSTALL_PREFIX /tmp/hello)
add_executable(main main.cpp)
# 安装命令
install(TARGETS main RUNTIME DESTINATION bin)
#同时生成两个库(.so动态库和.a静态库)
# 生成可执行程序
add_library(util SHARED utils.cpp utils.h)
set_target_properties(util PROPERTIES OUTPUT_NAME "util")
安装链接库
# 生成链接库
add_library(util SHARED utils.cpp utils.h)
set_target_properties(util PROPERTIES OUTPUT_NAME "util")
# 设置链接库的版本信息
set_target_properties(util PROPERTIES VERSION 0.1 SOVERSION 0)
# 安装链接库和头文件
install(TARGETS util LIBRARY DESTINATION lib)
install(FILES utils.h DESTINATION include/util)
使用链接库
-
在工程下创建
cmake
文件夹 -
在
cmake
下创建FindUtil.cmake
# 设置根路径 set(util_root /tmp/hello) # 设置头文件路径 find_path(util_INCLUDE_DIRS utils.h ${util_root}/include/util) # 设置查找仓库路径 find_library(util_LIBRARYS NAMES util HINTS ${util_root}/lib)
-
在
CMakeLists.txt
中定义如下cmake_minimum_required(VERSION 3.14) project(UseCmake) set(CMAKE_CXX_STANDARD 14) # 设置cmake的配置文件路径 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) # 查找库(和FindUtil.cmake名字相关) find_package(Util) # 设置头文件路径 include_directories(${util_INCLUDE_DIRS}) # 生成可执行程序 add_executable(UseCmake main.cpp) # 链接库 target_link_libraries( UseCmake ${util_LIBRARYS} )
关于使用三方库
以奥博驱动举例
第一种使用方案
FindAuBo.cmake中:
# 设置头文件的路径
set(AuBo_INCLUDE_DIRS
${AuBo_DIR}/libconfig/linux_x64/inc;
${AuBo_DIR}/log4cplus/linux_x64/inc;
${AuBo_DIR}/protobuf/linux_x64/google/protobuf/inc;
${AuBo_DIR}/robotController/Header;
${AuBo_DIR}/robotSDK/inc)
# 库的名称
SET(AuBo_LIB_COMPONENTS config;log4cplus;protobuf;protobuf-
FOREACH(aubo_component ${AuBo_LIB_COMPONENTS})
# 查找库
find_library(lib_${aubo_component} NAMES ${aubo_component} PATHS
${AuBo_DIR}/protobuf/linux-x64/lib
${AuBo_DIR}/libconfig/linux_x64/lib
${AuBo_DIR}/log4cplus/linux_x64/lib
${AuBo_DIR}/robotController/linux_x64
${AuBo_DIR}/robotSDK/lib/linux_x64
NO_DEFAULT_PATH)
# 所有的库都保存在AuBo_LIBRARIES中(也不需要)
# set(AuBo_LIBRARIES ${AuBo_LIBRARIES};${lib_${aubo_component}})
ENDFOREACH()
CmakeLists.txt中使用
include_directories(${AuBo_INCLUDE_DIRS})
target_link_libraries(
main
# ${AuBo_LIBRARIES}
${AuBo_LIB_COMPONENTS}
)
第二种方案
FindAuBo.cmake中:
# 头文件的文件夹
set(AuBo_INCLUDE_DIRS
${AuBo_DIR}/libconfig/linux_x64/inc;
${AuBo_DIR}/log4cplus/linux_x64/inc;
${AuBo_DIR}/protobuf/linux_x64/google/protobuf/inc;
${AuBo_DIR}/robotController/Header;
${AuBo_DIR}/robotSDK/inc)
# 链接库的文件夹
set(AuBo_LINK_DIRS
${AuBo_DIR}/protobuf/linux-x64/lib
${AuBo_DIR}/libconfig/linux_x64/lib
${AuBo_DIR}/log4cplus/linux_x64/lib
${AuBo_DIR}/robotController/linux_x64
${AuBo_DIR}/robotSDK/lib/linux_x64)
CmakeLists.txt文件中:
include_directories(${AuBo_INCLUDE_DIRS})
link_directories(${AuBo_LINK_DIRS})
target_link_libraries(
main
# ${AuBo_LIBRARIES}
${AuBo_LIB_COMPONENTS}
)
总结:
如果有
find_library()
就不需要link_directories()
了
find_package的工作机制
-
首先会在模块路径中寻找
Find<name>.cmake
,这是查找库的一个典型方式。具体查找路径依次为: a. 变量
${CMAKE_MODULE_PATH}
中的所有目录b. 如果没有,然后再查看它自己的模块目录/share/cmake-xx/Modules/ (通过
$CMAKE_ROOT
输出)。这称为模块模式。 -
如果没有找到,会在
~/.cmake/packages/
或/usr/local/share/
中的各个包目录中查找,寻找
<库名字的大写>Config.cmake
或者<库名字的小写>-config.cmake
,称为配置模式比如
Opencv
:它会查找/usr/local/share/OpenCV
中的OpenCVConfig.cmake
或opencv-config.cmake