cmake 通过封装为子项目的形式引入第三方已经生成且打包好的动态库拥有数量不确定的库文件要求跨平台动态库的存储使用标准的目录结构 lib下存储lib或a等 include bin下面存储dll或so等需要把动态库当成子项目处理给出完整案例
以下是一个使用CMake引入第三方动态库的完整案例:
假设有如下的目录结构:
- project
|- CMakeLists.txt
|- lib
| |- lib1
| | |- lib1.lib (或 lib1.a)
| | |- lib1.dll (或 lib1.so)
| |- lib2
| |- lib2.lib (或 lib2.a)
| |- lib2.dll (或 lib2.so)
|- include
|- lib1
| |- lib1.h
|- lib2
|- lib2.h
首先,在project目录下创建一个CMakeLists.txt文件,并编写以下内容:
cmake_minimum_required(VERSION 3.10)
project(MyProject)
# 设置C++标准
set(CMAKE_CXX_STANDARD 11)
# 设置库文件和头文件的目录
set(LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib)
set(INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
# 引入第三方库
add_subdirectory(${LIB_DIR}/lib1)
add_subdirectory(${LIB_DIR}/lib2)
# 设置可执行文件
add_executable(MyExecutable main.cpp)
# 链接第三方库
target_link_libraries(MyExecutable lib1 lib2)
# 设置可执行文件的头文件路径
target_include_directories(MyExecutable PUBLIC ${INCLUDE_DIR})
然后,在project/lib/lib1目录下创建一个CMakeLists.txt文件,并编写以下内容:
# 查找lib1的源文件
file(GLOB LIB1_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
# 生成lib1的库文件
add_library(lib1 SHARED ${LIB1_SOURCES})
# 设置lib1的头文件路径
target_include_directories(lib1 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../include/lib1)
# 设置lib1的库文件输出路径
set_target_properties(lib1 PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../bin)
然后,在project/lib/lib2目录下创建一个CMakeLists.txt文件,并编写以下内容:
# 查找lib2的源文件
file(GLOB LIB2_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
# 生成lib2的库文件
add_library(lib2 SHARED ${LIB2_SOURCES})
# 设置lib2的头文件路径
target_include_directories(lib2 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../include/lib2)
# 设置lib2的库文件输出路径
set_target_properties(lib2 PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../bin)
最后,在project目录下创建一个main.cpp文件,并编写以下内容:
#include <iostream>
#include "lib1/lib1.h"
#include "lib2/lib2.h"
int main() {
std::cout << "Hello, World!" << std::endl;
lib1::hello();
lib2::hello();
return 0;
}
现在,可以在project目录下使用CMake来构建项目了:
cd project
mkdir build
cd build
cmake ..
make
构建完成后,会在project/build目录下生成一个可执行文件MyExecutable。运行该可执行文件,即可看到输出结果
原文地址: https://www.cveoy.top/t/topic/iRCQ 著作权归作者所有。请勿转载和采集!