cmake 三种情况的构建(有头文件和源文件、有头文件、有库和头文件)

在这里插入图片描述
上面分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;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默执_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值