Linux cmake 初窥【3】

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/bash

echo "compile file"

if [ ! -d "./build/" ]; then

        # 没有文件夹 创建文件夹
        echo "no build direct"
        mkdir build

else

        # 存在文件夹 删除文件夹内容
        echo "already build direct"
        rm ./build/* -r

fi

cd ./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

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-12 10:04:09       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-12 10:04:09       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-12 10:04:09       82 阅读
  4. Python语言-面向对象

    2024-05-12 10:04:09       91 阅读

热门阅读

  1. 根据指标体系数重排序算法

    2024-05-12 10:04:09       32 阅读
  2. gap意识

    2024-05-12 10:04:09       31 阅读
  3. 什么是ts?

    2024-05-12 10:04:09       34 阅读
  4. CTF-reverse逆向分析解题可能用上的脚本

    2024-05-12 10:04:09       32 阅读
  5. android 预加载进程

    2024-05-12 10:04:09       29 阅读
  6. 技术骨干向管理人才转变的全面策略

    2024-05-12 10:04:09       31 阅读
  7. 等保测评技术方案(六)

    2024-05-12 10:04:09       25 阅读
  8. Spring 使用 Groovy 实现动态server

    2024-05-12 10:04:09       33 阅读
  9. C++面向对象学习笔记五

    2024-05-12 10:04:09       29 阅读
  10. leetcode1290-Convert Binary Number in a Linked List to Integer

    2024-05-12 10:04:09       33 阅读
  11. Go有无缓冲channel的区别

    2024-05-12 10:04:09       27 阅读
  12. gin:01-框架安装

    2024-05-12 10:04:09       32 阅读