上面分3部分
MyLib1
目的是让最外层的cmake可以访问到MyLib1的头文件
a.cpp、b.cpp、c.cpp 的内容:
#include "MyLib1.h"
// #include <opencv2/opencv.hpp>
MyLib1.h的内容是空的
CMakeLists.txt的内容:
# 方法一
# 若文件少可以一个一个添加
# add_library(MyLib1 src/a.cpp src/b.cpp src/c.cpp)
# 方法二
# 默认静态库
# add_library(MyLib1 ${my_lib_dir})
# 搜索 指定目录下的源文件 (跨平台可能会出现问题)
# aux_source_directory(src my_lib_dir)
# 方法三
# 递归收集 src 目录下的所有 .cpp 源文件
file(GLOB_RECURSE my_lib_dir "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
#导入库
add_library(MyLib1 ${my_lib_dir})
# 头文件搜索路径
# 让 a.cpp b.cpp c.cpp 可以找到头文件 MyLib1.h
target_include_directories(
MyLib1
PUBLIC include
# PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include" # 这样写也可
)
# # opencv 添加
# find_package(OpenCV REQUIRED)
# target_link_libraries(
# MyLib1
# PUBLIC ${OpenCV_LIBS}
# )
MyLib2
MyLib2.h的内容是空的
目的是让最外层的cmake可以访问到MyLib2的头文件,但这里没有源文件只有头文件,写法就会不一样。
CMakeLists.txt的内容:
# 由于 MyLib2库中只有 .h 的头文件,没有.cpp的源文件, 同时可以在main.cpp文件中直接导入 MyLib2.h
# 接口库参数 INTERFACE
add_library(MyLib2 INTERFACE)
# 给目标添加目录
target_include_directories(
MyLib2
INTERFACE include
)
camera
这是一个外部的库,我们要导入它。为了演示内容都是空的。
CMakeLists.txt的内容:
#导入库 动态库 由外部导入的库 让最外部访问
add_library(camera SHARED IMPORTED GLOBAL)
# add_library:这是 CMake 中用于创建或导入库的命令。
# camera:为导入的库指定的名称,后续在项目中可以通过这个名称来引用该库。
# SHARED:表明导入的是一个共享库(动态库),在 Linux 系统中通常以 .so 为扩展名。
# IMPORTED:表示这个库是从外部导入的,而不是由当前 CMake 项目的源文件构建生成的。
# GLOBAL:该选项使得这个导入的目标在整个 CMake 项目中都是可见的,即使在不同的子目录中也能引用。
#写法二
# 设置搜索目录
# set_target_properties(
# camera PROPERTIES
# INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/include # 搜索头文件路径
# IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/lib/libMVSDK.so # 搜索so路径
# )
# set_target_properties:用于设置目标(这里是 camera 库)的属性。
# INTERFACE_INCLUDE_DIRECTORIES:该属性指定了使用 camera 库时需要包含的头文件所在的目录。${CMAKE_CURRENT_SOURCE_DIR} 是 CMake 内置变量,代表当前 CMakeLists.txt 文件所在的目录。所以这里指定的头文件搜索路径是当前目录下的 include 子目录。
# IMPORTED_LOCATION:该属性指定了导入库的实际文件位置。这里指定的是当前目录下的 lib 子目录中的 libMVSDK.so 文件。
#写法一
# 只是其中一个参数换了个写法
set_target_properties(
camera PROPERTIES
IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/lib/libMVSDK.so # 搜索so路径
)
# 给目标添加目录
target_include_directories(
camera
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include
)
# 跨平台的写法(理论上)
# if(WIN32)
# set_target_properties(
# camera PROPERTIES
# IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/lib/camera.dll
# )
# elseif(UNIX)
# set_target_properties(
# camera PROPERTIES
# IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/lib/libMVSDK.so
# )
# endif()
最外层
CMakeLists.txt的内容:
# CMakeLists.txt cmake文件名大小写不敏感
#指定cmake最低版本
cmake_minimum_required(VERSION 3.10)
#构建项目的名称
project(demo)
add_executable(
demo main.cpp
)
# 搜索目录
add_subdirectory(MyLib1)
add_subdirectory(MyLib2)
add_subdirectory(camera)
#设定链接依赖库
target_link_libraries(
demo
PRIVATE MyLib2
PRIVATE MyLib1
PRIVATE camera
)
main.cpp 的内容:
#include <iostream>
#include "MyLib2.h"
#include "MyLib1.h"
#include "CameraApi.h"
int main() {
std::cout << "测试成功" << std::endl;
return 0;
};