1.学习cmake的使用和CMakeLists.txt
文章目录
- 1.学习cmake的使用和CMakeLists.txt
- 1.1 cmake外部构建基础
- 1.2 让每个源文件目录都包含一个CMakeLists.txt
- 1.3 安装
- 1.4 构建静态库和动态库
-
- 1.5 安装共享库和头文件
- 1.6 使用创建的库
- 图
1.1 cmake外部构建基础
基础目录结构
- build 存放编译文件和输出文件
- include 存放头文件
- src 存放源文件
# CMakeLists.txt
# 2022/5/30
cmake_minimum_required(VERSION 3.0) # 确定最低版本
PROJECT (LEARN_CMAKE) #工程名
# 输出PROJECT_BINARY_DIR为编译目录/home/kt/Desktop/cpptest/build
MESSAGE(STATUS "This is BINARY dir " ${PROJECT_BINARY_DIR})
# 输出PROJECT_SOURCE_DIR为当前项目目录/home/kt/Desktop/cpptest
MESSAGE(STATUS "This is SOURCE dir " ${PROJECT_SOURCE_DIR})
set(CMAKE_CXX_STANDARD 11) #确定c++版本
SET(SRC_LIST src/main.cc src/test.cc) #确定编译的源文件
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/include") #指定头文件目录
ADD_EXECUTABLE(learn_cmake ${SRC_LIST}) #决定输出
编译方法:
cd build
cmake ..
make
./learn_cmake
1.2 让每个源文件目录都包含一个CMakeLists.txt
使用ADD_SUBDIRECTORY
添加子目录
其中外部CMakeLists.txt文件内容为
# CMakeLists.txt
# 2022/5/30
cmake_minimum_required(VERSION 3.0) # 确定最低版本
PROJECT (LEARN_CMAKE) #工程名
# 输出PROJECT_BINARY_DIR为编译目录/home/kt/Desktop/cpptest/build
MESSAGE(STATUS "This is BINARY dir " ${PROJECT_BINARY_DIR})
# 输出PROJECT_SOURCE_DIR为当前项目目录/home/kt/Desktop/cpptest
MESSAGE(STATUS "This is SOURCE dir " ${PROJECT_SOURCE_DIR})
set(CMAKE_CXX_STANDARD 11) #确定c++版本
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/include") #指定头文件目录
ADD_SUBDIRECTORY(src bin)
src目录下CMakeLists.txt文件内容为
SET(SRC_LIST main.cc test.cc) #确定编译的源文件
ADD_EXECUTABLE(learn_cmake ${SRC_LIST}) #决定输出
其中ADD_SUBDIRECTORY(src bin)
中的bin指定了编译的输出文件夹,也就是build目录下会生成一个bin目录,目标文件就生成在那里
1.3 安装
使用make install
命令将内容安装到/usr/bin
目录中
添加一些版权COPYRIGHT README runhello.sh doc/* 等内容
语法:INSTALL(关键字决定内容 内容 目的 路径)
其中路径如果使用相对路径会默认调用cmake的变量CMAKE_INSTALL_PREFIX
–> usr/local
示例:其中全部使用相对路径
# 在最外层的CMakeLists.txt处添加以下内容
# 安装文件 使用FILES
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake)
# 非目标文件的可执行程序安装 使用PROGRAMS
INSTALL(PROGRAMS runhello.sh DESTINATION bin)
# 安装目录 使用DIRECTORY 注意"doc/"表示安装目录下的内容,不加"/"表示安装目录
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake)
cmake后执行make install
命令(可能需要sudo 才能写入相应位置)
可以得到如下,成功安装
1.4 构建静态库和动态库
静态库扩展名一般为"a"或者"lib",动态库扩展名一般为"so"或者"dll"
语法:ADD_LIBRARY(输出名 SHARED/STATIC 内容)
- SHARED 共享库 / STATIC 静态库
- 库输出的库名字是libname.xxx,会在原名字name加上前缀lib再加上文件扩展名
# src目录下的CMakeLists.txt处添加以下内容
# 确定编译的源文件
SET(SRC_LIST main.cc test.cc)
# 生成共享库(动态库)
ADD_LIBRARY(hello SHARED ${SRC_LIST})
# 生成静态库
ADD_LIBRARY(hello STATIC ${SRC_LIST})
注意如果像上面那么写会报错如下信息,原因是重名了。
**解决方法:**使用SET_TARGET_PROPERTIES
语法
# src目录下的CMakeLists.txt处添加以下内容
# 确定编译的源文件
SET(SRC_LIST main.cc test.cc)
# 生成共享库(动态库)
ADD_LIBRARY(hello_shared SHARED ${SRC_LIST})
# 重命名为hello
SET_TARGET_PROPERTIES(hello_shared PROPERTIES OUTPUT_NAME "hello")
# 清除内容
SET_TARGET_PROPERTIES(hello_shared PROPERTIES CLEAN_DIRECTORY_OUTPUT 1)
# 生成静态库
ADD_LIBRARY(hello STATIC ${SRC_LIST})
SET_TARGET_PROPERTIES(hello PROPERTIES OUTPUT_NAME "hello")
SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECTORY_OUTPUT 1)
make后生成了相应的动态库和静态库
设置库的版本号
语法例如:SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
VERSION 指代动态库版本,SOVERSION 指代 API 版本
1.5 安装共享库和头文件
# 安装头文件和动态库和静态库
INSTALL(FILES ../include/test.h DESTINATION include/test)
INSTALL(TARGETS hello_shared hello LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
- TARGETS 后面指要安装的内容
- LIBRARY 动态库
- ARCHIVE 静态库
# 执行cmake
cmake -D CMAKE_INSTALL_PREFIX=usr/ ..
指定默认相对路径变量 CMAKE_INSTALL_PREFIX
为 usr/
再执行make / make install 可以看到安装结果,(显示up-to-date是因为我之前已经安装过一次了)
1.6 使用创建的库
在1.5已经将相应的库和头文件安装好了,使用只需要在新工程中加入对应的库和头文件
# 加入头文件目录
INCLUDE_DIRECTORIES("/usr/include/test")
# 引入库
TARGET_LINK_LIBRARIES(learn_cmake libhello.so)
注意TARGET_LINK_LIBRARIES
需要加在ADD_EXECUTABLE
后面,否则会报错
就可以正常编译运行了。还可以用ldd learn_cmake
来查看链接情况
图
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)