赞
踩
CMAKE创建并安装库以及多级多层编译
秋酷 • 2020 年 03 月 13 日
cmake编译多级多层文件教程
创建动态库或者静态库
文件树如下helloworld/
-CMakeLists.txt
-include/
--hello.h
--world.h
-src/
--hello.cpp
--world.cpp
-lib/
这里我们将helloworld编为一个动态链接库,并将其存放在lib文件目录下:cmake_minimum_required(VERSION 1.5) #这里version必须大写
project(HELLO_WROLD)
aux_source_directory(${PROJECT_SOURCE_DIR}/src src_list) #将源文件目录设置给变量src_list
include_directories(include) # 添加头文件目录
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)#设置动态库存放路径
add_library(helloworld shared ${src_list}) #生成动态库
add_library(helloworld_static STATIC ${src_list}) #成成静态库
set_target_properties(helloworld_static PROPERTIES OUTPUT_NAME "helloworld") #生成同名的静态库和动态库
采用外部编译的方式,即我们新建一个build文件夹,在此文件夹内进行编译cd build
cmake ..
make
应用生层的库的三种方法
引用库需要头文件即include的路径以及库文件so a的路径。传入绝对路径方法
我们在helloworld文件夹同级目录中创建文件夹test,文件结构如下;test/
-CMakeLists.txt
-build/
-main.cpp
helloworld/
-include/
--hello.h
--world.h
-src/
--hello.cpp
--world.cpp
-lib/
这里的main.cpp需要调用helloworld中的库函数,因此我们在CMakeLists.txt文件中需要这样引入路径cmake_minimum_required(VERSION 1.5)
project(MAIN)
add_compile_options(std=c++11) #声明使用c++11标准编译
include_directories(${PROJECT_SOURCE_DIR}/../helloworld/include) #导入库的头文件 若还需要其他头文件,继续引入即可
set(helloworldlib ${PROJECT_SOURCE_DIR}/../helloworld/lib) # 设置变量helloworldlib存放库文件路径
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/exe) #设置可执行文件存放路径
add_executable(main ${PROJECT_SOURCE_DIR}/main.cpp) #生成可执行文件
target_link_libraries(main ${helloworldlib}/helloworld.dylib) #连接库文件中的helloworld.dylib库将库安装到/usr或者/usr/local中,然后在引用
安装库函数安装头文件
安装库
在helloworld文件夹中
修改CMakeLists.txtcmake_minimum_required(VERSION 1.5)
project(HELLOWORLD)
add_compile_options(-std=c++11)
#生成库
include_directories(include)
aux_source_directory(${PROJECT_SOURCE_DIR}/src src_list)
aux_source_directory(${PROJECT_SOURCE_DIR}/include include_list)
add_library(helloworld_static STATIC ${src_list}) #生成链接库 SHARED 动态库 STATIC是静态库
add_library(helloworld SHARED ${src_list})
set_target_properties(helloworld PROPERTIES VERSION 1.2 SOVERSION 1) #设置库的版本信息
#安装库
set(CMAKE_INSTALL_PREFIX /usr/local) #指定安装目录前缀,不指定默认为/usr/local
message(${CMAKE_INSTALL_PREFIX})#打印
install(FILES ${include_list} DESTINATION include) #头文件安装至。/usr/include
install(TARGETS helloworld helloworld_static ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib) #库文件安装至 /usr/lib中 ARCHIVE是静态库 LIBRARY是动态库cd build
cmake ..
make
make install #多出这一句
库的引入cmake_minimum_required(VERSION 1.5)
project(MAIN)
include_directories(/usr/include)
add_executable(main src/main.cpp)
target_link_libraries(main /usr/lib/libhelloworld.a)find_package函数查找cmake不提供搜索库的方法,不会对库本身的环境变量进行设置(需要手动配置)
一般称为模块模式和配置模式 分为module 和config
指令按照优先级顺序在指定路径查找Findxxx.cmake和xxxConfig.cmake;
cmake 能够找到两个文件中的任何一个我们都可已使用此库常用变量常用指令含义_FOUNDif(_FOUND)找到库的标志
_INCLUDE_DIR;_INCLUDESfind_path(_INCLUDES)库的头文件路径
_LIBRARY;_LIBSfind_library(_LIBS)库文件路径
生成一个Find.cmake 文件
并将此文件安装至系统cmake处,便于其他文件使用时使用find_pageage函数进行查找
多级目录,多层CMakeLists.txt
文件分布:.
├── CMakeLists.txt
├── bin
│ ├── 27_answer
│ └── 28_answer
├── include
├── lib
│ └── libutilities.dylib
└── src
├── 27_MirrorOfBinaryTree
│ ├── CMakeLists.txt
│ └── MirrorOfBinaryTree.cpp
├── 28_SymmetricalBinaryTree
│ ├── CMakeLists.txt
│ └── SymmetricalBinaryTree.cpp
├── CMakeLists.txt
└── Utilities
├── CMakeLists.txt
├── include
│ ├── Array.h
│ ├── BinaryTree.h
│ ├── List.h
│ ├── StringUtil.h
│ └── Tree.h
└── src
├── Array.cpp
├── BinaryTree.cpp
├── List.cpp
├── StringUtil.cpp
└── Tree.cpp
根目录下CMakeLIsts.txt文件内容如下:cmake_minimum_required(VERSION 3.0) # 版本要求
project(SWORDOFFER) #项目名称
add_compile_options(-std=c++17) #对C++版本要求,尽量高些
include_directories(${PROJECT_SOURCE_DIR}/src/Utilities/include # 头文件路径
${PROJECT_SOURCE_DIR}/include
/usr/local/include # 系统头文件路径
/usr/include)
link_directories(${PROJECT_SOURCE_DIR}/lib # 库函数路径
/usr/local/lib
/usr/lib)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) # 设置生成的可执行程序位置
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) # 设置库生成存放的文职
add_subdirectory(src) # 导入子目录,递归
src中CMakeLists.txt内容:add_subdirectory(27_MirrorOfBinaryTree)
add_subdirectory(28_SymmetricalBinaryTree)
add_subdirectory(Utilities)
src中utilities中cmakelists.txt文件内容:cmake_minimum_required(VERSION 3.15)
#生成动态链接库
project(UTILITIES)
add_compile_options(-std=c++17)
#将此工程src文件中的所有文件存到srclist中
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_LIST)
include_directories(${PROJECT_SOURCE_DIR}/include)
#生成动态库
ADD_LIBRARY(utilities SHARED ${SRC_LIST})
然后是最终的应用程序生成包括两个一个是27,一个是28他们的CMakeLists.txt文件分别为add_executable(27_answer MirrorOfBinaryTree.cpp)
target_link_libraries(27_answer utilities)add_executable(28_answer SymmetricalBinaryTree.cpp)
target_link_libraries(28_answer utilities)
此时我们在根目录下创建build并执行如下命令cd build
cmake ..
make
则会按照我们的CMakeLists.txt要求分别将编译生成的库utilities存放至根目录下/lib中,生成的可执行程序两个分别为27_answer和28_answer存放在/bin中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。