1.开发背景
基于上一篇的基础上,已经实现了多个源文件路径调用,但是没有库的实现
2.开发需求
基于 cmake 的动态库和静态库的调用
3.开发环境
ubuntu 20.04 + cmake-3.23.1
4.实现步骤
4.1 准备源码文件
基于上个试验的基础上,增加了动态库 LibShare 和 静态库 LibStatic
首先还是解析顶层的 CMakeLists.txt,指定了链接库文件
# Top 顶层 Cmake
cmake_minimum_required(VERSION 2.8.11)# 添加子路径 cmake 执行调用对应子路径的 cmake
add_subdirectory(./src)
add_subdirectory(./src/func1)
add_subdirectory(./src/func2)
#add_subdirectory(./LibShare)
#add_subdirectory(./LibStatic)# 编译过程打印信息
message("top cmake show message") # 打印信息
#message(SEND_ERROR "Error Show") # 打印错误信息 可以显示当前位置行数# 定义工程名 暂时未见起作用
project(ProjectTop)# 指定编译工具 X86 还是 ARM
#SET(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_CXX_COMPILER g++)# 指定生成的可执行文件名
set(EXE_FILE_NAME mainFile)# 添加 include 包含路径 否则在源代码中引用头文件需要指定完整路径
include_directories(${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_SOURCE_DIR}/src)
include_directories(${PROJECT_SOURCE_DIR}/src/func1)
include_directories(${PROJECT_SOURCE_DIR}/src/func2)# 添加 include 包含路径 否则库文件中引用头文件需要指定完整路径
include_directories(${PROJECT_SOURCE_DIR}/LibStatic)
include_directories(${PROJECT_SOURCE_DIR}/LibShare)# 添加源代码路径
aux_source_directory(${PROJECT_SOURCE_DIR} SRC_DIR)
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_DIR)
aux_source_directory(${PROJECT_SOURCE_DIR}/src/func1 SRC_DIR)
aux_source_directory(${PROJECT_SOURCE_DIR}/src/func2 SRC_DIR)# 添加库文件路径 可以是动态库或者静态库
link_directories(${PROJECT_SOURCE_DIR}/LibShare/build)
link_directories(${PROJECT_SOURCE_DIR}/LibStatic/build)# 添加执行文件 1、多次调用 可以生成多个可执行文件
add_executable(${EXE_FILE_NAME} ${SRC_DIR})
target_link_libraries(${EXE_FILE_NAME} -lShare) # 动态库文件 libShare.so
target_link_libraries(${EXE_FILE_NAME} -lStatic) # 静态库文件 libStatic.a
LibShare CMakeLists.txt,主要是负责管理动态库源文件
# LibShare Cmake
cmake_minimum_required(VERSION 2.8.11)# 编译过程打印信息
message("lib share cmake show message") # 打印信息# 定义工程名 暂时未见起作用
project(ProjectLibShare)# 添加 include 包含路径 否则在源代码中引用头文件需要指定完整路径
include_directories(${PROJECT_SOURCE_DIR})add_library(Share SHARED LibShare.cpp)
LibStatic CMakeLists.txt,主要负责管理静态库源文件
# LibStatic Cmake
cmake_minimum_required(VERSION 2.8.11)# 编译过程打印信息
message("lib static cmake show message") # 打印信息# 定义工程名 暂时未见起作用
project(ProjectLibStatic)# 添加 include 包含路径 否则在源代码中引用头文件需要指定完整路径
include_directories(${PROJECT_SOURCE_DIR})add_library(Static LibStatic.cpp)
最后介绍一下 main.cpp 文件
#include <stdio.h>#include "func1.h"
#include "func2.h"
#include "LibShare.h"
#include "LibStatic.h"int main(int argc, char* argv[])
{printf("%s hello cmake\r\n", __func__);/* 外调文件功能 */Func1_Test();Func2_Test();LibShare_Test();LibStatic_Test();return 0;
}
4.2 准备编译脚本
先编译动态库,再编译可执行文件
#!/bin/bashecho "compile file"if [ ! -d "./build/" ]; then# 没有文件夹 创建文件夹echo "no build direct"mkdir buildelse# 存在文件夹 删除文件夹内容echo "already build direct"rm ./build/* -rficd ./LibShare && rm -r ./build/* && cmake -B ./build
cd ./build && make -j4
cd ../../cd ./LibStatic && rm -r ./build/* && cmake -B ./build
cd ./build && make -j4
cd ../../cmake -B ./build
cd ./build && make -j4
4.3 执行编译脚本
./compile.sh
4.4 运行程序
./mainFile