CMake:静态库链接其他动态库或静态库(九)

1、项目结构

对于下面这样一个项目

  • 把calc模块做成静态或者动态库
  • 把sort模块做成静态库
  • 然后再sort模块中的*.cpp调用calc模块生成的库即可(这样就制作了一个静态库引用动态或者静态库)
  • test模块用于测试sort模块中的内容
shell 复制代码
.
├── calc
│   ├── add.cpp
│   ├── CMakeLists.txt
│   ├── dived.cpp
│   ├── mul.cpp
│   └── sub.cpp
├── CMakeLists.txt
├── inc
│   ├── calc.h
│   └── sort.h
├── sort
│   ├── CMakeLists.txt
│   ├── insert.cpp
│   └── select.cpp
└── test
    ├── CMakeLists.txt
    └── sort.cpp

4 directories, 13 files

根目录的CMakeLists.txt编写

cmake 复制代码
cmake_minimum_required(VERSION 3.10.2)
set(CMAKE_CXX_STANDARD 14)
project(ProjectName)

# 库生成的路径
set(LIBPATH ${PROJECT_SOURCE_DIR}/lib)

# 可执行程序的存储目录
set(EXECPATH ${PROJECT_SOURCE_DIR}/bin)

# 头文件目录
set(HEADPATH ${PROJECT_SOURCE_DIR}/inc)

# 库文件的名字
set(CALCLIB calc)
set(SORTLIB sort)

# 可执行程序的名字
set(EXECNAME sort_main)

# 添加子节点目录
# add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
add_subdirectory(calc)
add_subdirectory(sort)
add_subdirectory(test)
2、静态库引用静态库
2.1、calc模块CMakeLists.txt
cmake 复制代码
cmake_minimum_required(VERSION 3.10.2)
project(calc)

# 搜索源文件
aux_source_directory(./ src_list)
# 添加头文件
include_directories(${HEADPATH})
# 设置库文件存储的位置
set(LIBRARY_OUTPUT_PATH ${LIBPATH})
# 制作静态库文件
add_library(${CALCLIB} STATIC ${src_list})
2.2、sort模块CMakeLists.txt
cmake 复制代码
cmake_minimum_required(VERSION 3.10.2)
project(sort)

# 搜索源文件
file(GLOB src_list ./*.cpp)
# 添加头文件
include_directories(${HEADPATH})

# 链接已有的静态库  静态库的链接要写在制作之前
link_directories(${LIBPATH})
link_libraries(${CALCLIB})

# 设置库文件存储的位置
set(LIBRARY_OUTPUT_PATH ${LIBPATH})

# 制作静态库文件
add_library(${SORTLIB} STATIC ${src_list})
2.3、test模块CMakeLists.txt
cmake 复制代码
cmake_minimum_required(VERSION 3.10.2)
project(test)

# 搜索源文件
aux_source_directory(./ main)

# 包含头文件
include_directories(${HEADPATH})

# 连接静态库
link_directories(${LIBPATH})
link_libraries(${SORTLIB})

# 设置可执行程序输出位置
set(EXECUTABLE_OUTPUT_PATH ${EXECPATH})

# 生成可执行程序
add_executable(${EXECNAME} ${main})
2、静态库链接动态库
2.1、calc模块CMakeLists.txt
cmake 复制代码
cmake_minimum_required(VERSION 3.10.2)
project(calc)

# 搜索源文件
aux_source_directory(./ src_list)
# 添加头文件
include_directories(${HEADPATH})
# 设置库文件存储的位置
set(LIBRARY_OUTPUT_PATH ${LIBPATH})
# 制作动态库文件
add_library(${CALCLIB} SHARED ${src_list})
2.2、sort模块CMakeLists.txt
cmake 复制代码
cmake_minimum_required(VERSION 3.10.2)
project(sort)

# 搜索源文件
file(GLOB src_list ./*.cpp)
# 添加头文件
include_directories(${HEADPATH})

# 设置库文件存储的位置
set(LIBRARY_OUTPUT_PATH ${LIBPATH})

# 制作静态库文件
add_library(${SORTLIB} STATIC ${src_list})

# 链接已有的动态库  动态库的链接要写在后面
link_directories(${LIBPATH})
target_link_libraries(${SORTLIB} ${CALCLIB})
2.3、test模块CMakeLists.txt
cmake 复制代码
cmake_minimum_required(VERSION 3.10.2)
project(test)

# 搜索源文件
aux_source_directory(./ main)

# 包含头文件
include_directories(${HEADPATH})

# 连接静态库
link_directories(${LIBPATH})
link_libraries(${SORTLIB})

# 设置可执行程序输出位置
set(EXECUTABLE_OUTPUT_PATH ${EXECPATH})

# 生成可执行程序
add_executable(${EXECNAME} ${main})
相关推荐
QiLinkOS8 分钟前
第三视觉理解徐玉生与他的商业活动(32)
大数据·c++·人工智能·算法·开源协议
用户0292666613330 分钟前
Linux 用户管理知识与应用实践(三:用户组及修改用户密码)
linux
汉克老师42 分钟前
GESP2026年6月认证C++一级( 第一部分选择题(8-15))精讲
c++·continue·运算符·while·break·gesp1级·模运算
鹏易灵1 小时前
C++——7.类与对象,掌握封装、继承、多态.详解
开发语言·c++·算法
Mortalbreeze1 小时前
深入 Linux 线程机制(三):线程互斥——竞争条件与互斥锁的本质
linux·运维·服务器·c++·算法
汉克老师1 小时前
GESP2026年6月认证C++一级( 第一部分选择题(1-7))精讲
c++·运算符·表达式·赋值·gesp1级·输入与输出·单循环
ALex_zry1 小时前
C++26 Freestanding 库扩展详解:无操作系统也能用标准库
java·jvm·c++
鱼听禅1 小时前
CentOS 源码模式配置SVNAdmin2管理SVN仓库
linux·svn·centos
Amonter1 小时前
RK3399ProD移植主线Linux内核
linux·rockchip·rk3399pro
码上有光1 小时前
c++:map和set的底层实现
android·java·c++·set·map