Linux cmake 初窥【3】

embedded/2024/10/18 22:29:48/

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


http://www.ppmy.cn/embedded/38142.html

相关文章

FreeRTOS学习笔记-基于stm32(6)时间片调度实验

1、什么是时间片调度 在任务优先级相同的时候&#xff0c;CPU会轮流使用相同的时间去执行它&#xff0c;即时间片调度。这个相同的时间就是时间片。而时间片的大小就是SysTick的中断周期&#xff08;SysTick的中断周期可以修改&#xff09;。 比如有三个相同优先级的任务在运行…

【C++】命名空间和IO流

一切都从这个代码开始&#xff01;&#xff01;&#xff01; #include<iostream>using namespace std;int main() {cout << "Hello world!" << endl;return 0; } 命名空间 当我们写了这么一段代码的时候... Ctrl F5运行&#xff0c;发现报错了..…

外企接受大龄程序员吗?

本人知乎账号同公众号&#xff1a;老胡聊Java&#xff0c;欢迎留言并咨询 亲身体会外企经历所见所闻&#xff0c;外企能接受大龄程序员。 1 大概是10年的时候&#xff0c;进一家知名外企&#xff0c;和我一起进的一位manager&#xff0c;后来听下来&#xff0c;年龄35&#xf…

使用 XTuner 完成llama3小助手认知微调

1.首先请报名课程&#xff1a; 2.环境配置 conda create -n llama3 python3.10 conda activate llama3 conda install pytorch2.1.2 torchvision0.16.2 torchaudio2.1.2 pytorch-cuda12.1 -c pytorch -c nvidia 2.1 下载模型 新建文件夹 mkdir -p ~/model cd ~/model 从Op…

linux内核源码分析--核心网络文件和目录

图3-2显示了在/proc/sys中由网络代码所使用的主要目录&#xff0c;就每个目录而言&#xff0c;都列出了在哪一章描述其文件。 proc/sys/net bridge ipv4 core route neigh conf 图3-2/proc/sys/net 中的核心目录 根据前借所述&#xff0c;我们来看net中的树根是如何定义的&…

树莓派4b测量PM2.5

1.GP2Y1010AU0F粉尘传感器连接图 2. GP2Y1010AU0F工作原理 工作原理 传感器中心有个洞可以让空气自由流过,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量。 3.源代码 main.py # coding=UTF-8 import RPi.GPIO as GPIO from ADC import ADS1015…

XORM 框架的使用

1、xorm 1.1、xorm 简介 xorm 是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。 特性 支持 struct 和数据库表之间的灵活映射&#xff0c;并支持自动同步事务支持同时支持原始SQL语句和ORM操作的混合执行使用连写来简化调用支持使用ID, In, Where, Limit,…

旧衣回收小程序开发:线上回收模式成为行业发展趋势

当下人们生活水平在不断提高&#xff0c;对衣服的要求也在增加&#xff0c;更新速度越来越快&#xff0c;闲置下来的旧衣服也在增加&#xff0c;为了减少浪费&#xff0c;旧衣回收行业受到了大众的关注。旧衣回收对我国资源回收、环境保护具有非常大的意义。 在互联网时代下&a…