0x01 介绍
CMake来构建动态库(也称为共享库)。要构建动态库,您需要在CMakeLists.txt中使用CMake的add_library命令,并指定库的类型为SHARED。
学习cmake, 理解了前3节内容 后面都比较简单。
要使用CMake创建动态库,您需要完成以下步骤:
- 创建一个名为CMakeLists.txt的文件,并将其放在库的根目录中。
- 使用cmake_minimum_required命令指定CMake的最低版本要求。
- 使用project命令指定库的名称。使用set命令设置生成文件的输出目录。
- 使用include_directories命令指定需要包含的文件夹。
- 使用add_library命令添加库的源代码文件。指定库的类型为SHARED。
- 下面是一个示例CMakeLists.txt文件,它用于创建一个名为hello_library的动态库
要使用CMake创建可执行文件链接动态库,需要在以上基础上完成以下步骤:
- 使用add_executable添加可执行文件代码
- 使用target_link_libraries链接静态库hello_library
0x02 示例
下面是一个简单的demo,使用 CMake 构建一个共享/动态库:
本教程中的文件如下:
ln28@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_04$ tree . ├── CMakeLists.txt ├── build ├── include │ └── shared │ └── Hello.h └── src ├── Hello.cpp └── main.cpp 4 directories, 4 files
[CMakeLists.txt] - 包含要运行的 CMake 命令
# 指定CMake的最低版本要求。 cmake_minimum_required(VERSION 3.1) # 使用project命令指定库的名称 project(hello_library) # 使用add_library命令添加库的源代码文件。指定库的类型为SHARED add_library(hello_library SHARED src/Hello.cpp) # 添加别名,允许你在将目标链接到其他目标时使用别名引用该目标 add_library(hello::library ALIAS hello_library) # 添加头文件目录 target_include_directories(hello_library PUBLIC ${PROJECT_SOURCE_DIR}/include) # 使用add_executable添加可执行文件代码 add_executable(hello_binary src/main.cpp) # 使用target_link_libraries链接静态库hello_library target_link_libraries(hello_binary PRIVATE hello::library)
[include/shared/Hello.h] - 要包含的头文件
#ifndef __HELLO_H__ #define __HELLO_H__ class Hello { public: void print(); }; #endif
[src/Hello.cpp] - 要编译的源文件
#include <iostream> #include "shared/Hello.h" void Hello::print() { std::cout << "Hello Shared Library!" << std::endl; } [src/main.cpp] - 具有 main 的源文件 #include "shared/Hello.h" int main(int argc, char *argv[]) { Hello hi; hi.print(); return 0; }
使用cmake .. && make -j24进行编译生成出 hello_binary 和 libhello_library.so, 你也可以参考
ln28@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_04/build$ cmake .. && make -j24 -- Configuring done -- Generating done -- Build files have been written to: /mnt/d/Project/Cmake_examples/cmake_basics_04/build Scanning dependencies of target hello_library [ 25%] Building CXX object CMakeFiles/hello_library.dir/src/Hello.cpp.o [ 50%] Linking CXX shared library libhello_library.so [ 50%] Built target hello_library Scanning dependencies of target hello_binary [ 75%] Building CXX object CMakeFiles/hello_binary.dir/src/main.cpp.o [100%] Linking CXX executable hello_binary [100%] Built target hello_binary ln28@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_04/build$ ls CMakeCache.txt CMakeFiles Makefile cmake_install.cmake hello_binary libhello_library.so ln28@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_04/build$ ./hello_binary Hello Shared Library!