当前位置: 首页 > news >正文

C语言多个源程序编译的CMakeList文件编写/源程序生成动态库

1.编译多个源程序时CMakeLists文件编写

1.若源程序目录结构如下:

在这里插入图片描述

main.cpp中include“LCD_2inch4.h”头文件,而LCD_2inch4.h中include其它源程序,则CmakeLists.txt文件可为如下:
# 设置项目名称  
cmake_minimum_required(VERSION 3.10) # 确保CMake版本足够新  
project(MyProject)  set(CMAKE_SYSTEM_NAME Linux)
#set(CMAKE_SYSTEM_PROCESSOR arm)set(tools /home/tao/linux/milkv-duo256/host-tools/gcc/riscv64-linux-musl-x86_64)#set(CMAKE_SYSROOT ${tools}/sysroot)
set(CMAKE_C_COMPILER ${tools}/bin/riscv64-unknown-linux-musl-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/riscv64-unknown-linux-musl-g++)
set(CMAKE_AR ${tools}/bin/riscv64-unknown-linux-musl-ar)
set(CMAKE_RANLIB ${tools}/bin/riscv64-unknown-linux-musl-ranlib)# 定义目录变量  
set(DIR_Config   "${CMAKE_SOURCE_DIR}/lib/Config")  
set(DIR_EPD      "${CMAKE_SOURCE_DIR}/lib/LCD")  
set(DIR_FONTS    "${CMAKE_SOURCE_DIR}/lib/Fonts")  
set(DIR_GUI      "${CMAKE_SOURCE_DIR}/lib/GUI")  
set(DIR_Examples "${CMAKE_SOURCE_DIR}/examples")  
set(DIR_wiringx "/home/tao/linux/milkv-duo256/duo-examples/duo-sdk/rootfs/usr")
set(DIR_BIN      "${CMAKE_SOURCE_DIR}/bin")  
#wiringx是main.cpp中include的其他头文件# 设置编译选项  
set(CMAKE_CXX_STANDARD 11) # 假设您使用C++ (如果是C,请使用CMAKE_C_STANDARD)  
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -Wall")  # 定义USELIB变量并基于它决定是否链接库  这部分if判断可省去
set(USELIB "USE_DEV_LIB")  
if("${USELIB}" STREQUAL "USE_DEV_LIB")  set(LIBS pthread m)  
else()  set(LIBS "")  
endif()  # 添加包含目录  ,即头文件所在目录
include_directories(  ${DIR_Config}  ${DIR_EPD}  ${DIR_GUI}  ${DIR_FONTS}  ${DIR_Examples}  "${DIR_wiringx}/include"
)  # 添加源文件并设置目标  ,有源程序的文件夹
file(GLOB_RECURSE SRC_LIST  "${DIR_EPD}/*.c"  "${DIR_Config}/*.c"  "${DIR_GUI}/*.c"  "${DIR_Examples}/*.cpp"  "${DIR_FONTS}/*.c"  
)  #for opencv ,main中使用了opencv,不使用则可以不加
set(OpenCV_DIR "/home/tao/linux/milkv-duo256/duo-examples/opencv-mobile-milkv/opencv-mobile-4.9.0-milkv-duo/lib/cmake/opencv4")
find_package(OpenCV REQUIRED)
#添加opencv头文件
include_directories(${OpenCV_INCLUDE_DIRS})#指定由源程序生成可执行程序main,可换为其它名字
add_executable(main ${SRC_LIST})  # 查找库文件,指定搜索路径 ,添加第三方库时使用fnd_library,命令,之后 arget_link_libraries命令添加库
find_library(MY_LIB NAMES wiringx PATHS /home/tao/linux/milkv-duo256/duo-examples/duo-sdk/rootfs/usr/lib NO_DEFAULT_PATH)  # 如果USELIB是USE_DEV_LIB,则链接pthread和m库  
if("${USELIB}" STREQUAL "USE_DEV_LIB")  target_link_libraries(main ${LIBS} ${MY_LIB} ${OpenCV_LIBS} )  
endif()  # 设置输出目录为DIR_BIN(注意:CMake默认使用build目录,但可以通过设置CMAKE_ARCHIVE_OUTPUT_DIRECTORY等变量来改变)  
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${DIR_BIN})  
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${DIR_BIN})  
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${DIR_BIN})  # 清理规则(CMake不直接支持Makefile的clean目标,但可以使用make clean或自定义命令)  
# 在CMake中,通常使用`cmake --build . --target clean`来清理,这需要在项目根目录的CMakeLists.txt中定义clean目标  
# 这里为了简单起见,我们不定义clean目标  # 如果需要交叉编译,可以设置工具链文件或使用CMAKE_TOOLCHAIN_FILE变量  
# 例如:set(CMAKE_TOOLCHAIN_FILE "path/to/toolchain.cmake")  
# 注意:这需要在您的toolchain.cmake文件中定义交叉编译器的路径和其他相关设置  # 如果您使用的是C而不是C++,请将add_executable替换为add_executable并相应地更改变量名(例如CMAKE_C_FLAGS)
之后在bin目录中cmake … && make命令编译

2.将一些驱动源程序生成动态库so,方便调用

1.main.c每次调用LCD_2inch4.h中的函数需要一起编译这四个源程序文件夹,太麻烦,可将LCD的程序生成so动态链接库,CMakeLists.txt如下:
# 设置项目名称  
cmake_minimum_required(VERSION 3.10) # 确保CMake版本足够新  
project(MyProject)  set(CMAKE_SYSTEM_NAME Linux)
#指定编译器
set(tools /home/tao/linux/milkv-duo256/host-tools/gcc/riscv64-linux-musl-x86_64)set(CMAKE_C_COMPILER ${tools}/bin/riscv64-unknown-linux-musl-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/riscv64-unknown-linux-musl-g++)
set(CMAKE_AR ${tools}/bin/riscv64-unknown-linux-musl-ar)
set(CMAKE_RANLIB ${tools}/bin/riscv64-unknown-linux-musl-ranlib)# 定义目录变量  ,wiringx是调用外部的库,bin是指定生成的结果文件存放的地方
set(DIR_Config   "${CMAKE_SOURCE_DIR}/lib/Config")  
set(DIR_EPD      "${CMAKE_SOURCE_DIR}/lib/LCD")  
set(DIR_FONTS    "${CMAKE_SOURCE_DIR}/lib/Fonts")  
set(DIR_GUI      "${CMAKE_SOURCE_DIR}/lib/GUI")   
set(DIR_wiringx "/home/tao/linux/milkv-duo256/duo-examples/duo-sdk/rootfs/usr")
set(DIR_BIN      "${CMAKE_SOURCE_DIR}/bin")  # 设置编译选项  
set(CMAKE_CXX_STANDARD 11) # 假设您使用C++ (如果是C,请使用CMAKE_C_STANDARD)  
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -Wall")  
set(LIBS pthread m)  
# 添加包含目录  
include_directories(  ${DIR_Config}  ${DIR_EPD}  ${DIR_GUI}  ${DIR_FONTS}  "${DIR_wiringx}/include"
)  
# 添加源文件并设置目标  
file(GLOB_RECURSE SRC_LIST  "${DIR_EPD}/*.c"  "${DIR_Config}/*.c"  "${DIR_GUI}/*.c"   "${DIR_FONTS}/*.c"  
)  # 查找库文件,指定搜索路径  
find_library(MY_LIB NAMES wiringx PATHS /home/tao/linux/milkv-duo256/duo-examples/duo-sdk/rootfs/usr/lib NO_DEFAULT_PATH)  
#指定库名为lcd2in4,生成的文件叫做liblcd2in4.so
add_library(lcd2in4 SHARED ${SRC_LIST})target_link_libraries(lcd2in4 ${LIB} ${MY_LIB})  #添加需要使用的库# 设置输出目录为DIR_BIN(注意:CMake默认使用build目录,但可以通过设置CMAKE_ARCHIVE_OUTPUT_DIRECTORY等变量来改变)  
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${DIR_BIN})  
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${DIR_BIN})  
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${DIR_BIN})  
在bin目录使用cmake … && make即可生成库liblcd2inch4.so
  1. 把main.c中include""LCD_2inch4.h"改为lcd2inch4.h
  2. 新建一个lcd2inch4.h文件,内容就是原来main.c调用的LCD_2inch4.h中的内容,名字是否需要必须和库名字一样不清楚,这里是一样的。
  3. 将h文件 和so文件任意放在哪个位置,只需在CMakeLists.txt中find_librarys时指定so库文件位置即可
  4. 在这里插入图片描述
  5. CMakeLists.txt可为下:
# 设置项目名称  
cmake_minimum_required(VERSION 3.10) # 确保CMake版本足够新  
project(MyProject)  set(CMAKE_SYSTEM_NAME Linux)
#set(CMAKE_SYSTEM_PROCESSOR arm)set(tools /home/tao/linux/milkv-duo256/host-tools/gcc/riscv64-linux-musl-x86_64)#set(CMAKE_SYSROOT ${tools}/sysroot)
set(CMAKE_C_COMPILER ${tools}/bin/riscv64-unknown-linux-musl-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/riscv64-unknown-linux-musl-g++)
set(CMAKE_AR ${tools}/bin/riscv64-unknown-linux-musl-ar)
set(CMAKE_RANLIB ${tools}/bin/riscv64-unknown-linux-musl-ranlib)# 定义目录变量  
set(DIR_Examples "${CMAKE_SOURCE_DIR}/examples")  
set(DIR_wiringx "/home/tao/linux/milkv-duo256/duo-examples/duo-sdk/rootfs/usr")
set(DIR_BIN      "${CMAKE_SOURCE_DIR}/bin")  # 设置编译选项  
set(CMAKE_CXX_STANDARD 11) # 假设您使用C++ (如果是C,请使用CMAKE_C_STANDARD)  
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -Wall")  set(LIBS pthread m)  # 添加包含目录  
include_directories(  ${DIR_Examples}  "${DIR_wiringx}/include"
)  # 添加源文件并设置目标  
file(GLOB_RECURSE SRC_LIST  "${DIR_Examples}/*.cpp"   
)  
#for opencv,不使用则不添加
set(OpenCV_DIR "/home/tao/linux/milkv-duo256/duo-examples/opencv-mobile-milkv/opencv-mobile-4.9.0-milkv-duo/lib/cmake/opencv4")
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})add_executable(main ${SRC_LIST})  # 查找库文件,指定搜索路径  
find_library(MY_LIB NAMES wiringx PATHS /home/tao/linux/milkv-duo256/duo-examples/duo-sdk/rootfs/usr/lib NO_DEFAULT_PATH)  find_library(LCD_LIB NAMES lcd2in4 PATHS  ${DIR_Examples}  NO_DEFAULT_PATH) target_link_libraries(main ${LIBS} ${MY_LIB} ${OpenCV_LIBS} ${LCD_LIB})  # 设置输出目录为DIR_BIN(注意:CMake默认使用build目录,但可以通过设置CMAKE_ARCHIVE_OUTPUT_DIRECTORY等变量来改变)  
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${DIR_BIN})  
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${DIR_BIN})  
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${DIR_BIN})  

3.若cpp文件中include 其他头文件,但其他头文件对应源程序为c程序实现的,则使用extern "C"告诉编译器这些函数签名用c语言的函数签名。否则cpp不能识别其函数

在这里插入图片描述

相关文章:

C语言多个源程序编译的CMakeList文件编写/源程序生成动态库

1.编译多个源程序时CMakeLists文件编写 1.若源程序目录结构如下: main.cpp中include“LCD_2inch4.h”头文件,而LCD_2inch4.h中include其它源程序,则CmakeLists.txt文件可为如下: # 设置项目名称 cmake_minimum_required(VERSI…...

C# list集合

一、list集合基本使用 1.添加元素 ① 单个元素添加 List<int> list new List<int>();for (int i 0; i < 3; i){list.Add(i);}//输出&#xff1a;0,1,2 ②初始化时添加元素 List<int> list2 new List<int> { 1, 2, 3 };//输出&#xff1a;0,1…...

****三次握手和四次挥手

一、三次握手 1.简要描述TCP三次握手的过程 第一次握手&#xff0c;客户端发送SYN包到服务器&#xff1b; 第二次握手&#xff0c;服务器收到SYN包&#xff0c;回复一个SYNACK包&#xff1b; 第三次握手&#xff0c;客户端收到服务器的SYNACK包后&#xff0c;回复一个ACK包…...

开发语言Java+前端框架Vue+后端框架SpringBoot开发的ADR药物不良反应监测系统源码 系统有哪些优势?

开发语言Java前端框架Vue后端框架SpringBoot开发的ADR药物不良反应监测系统源码 系统有哪些优势&#xff1f; ADR药物不良反应监测系统具有多个显著的优势&#xff0c;这些优势主要体现在以下几个方面&#xff1a; 一、提高监测效率与准确性&#xff1a; 通过自动化的数据收集…...

问题排查|记录一次基于mymuduo库开发的服务器错误排查(段错误--Segmentation fault (core dumped))

问题记录&#xff1a; 在刚完成mymuduo库之后&#xff0c;写了一个简单的测试服务器&#xff0c; 但是在服务器运行后直接报错&#xff1a; cherryhcss-ecs-4995:~/mymuduo/example$ ./testserver Segmentation fault (core dumped)出现多错误这通常意味着程序试图访问其内存空…...

Mysql常用操作DQL数据库、表操作:

DQL是指MySQL数据库中的数据查询语言&#xff08;Data Query Language&#xff09;。它是用来从数据库中检索所需数据的语言。DQL允许用户通过指定查询条件和筛选条件来检索数据库中的数据&#xff0c;并以所需的方式来显示结果。DQL语句可以用于从单个表中查询数据&#xff0c…...

标题:Go语言中的YAML魔法:轻松配置你的环境

摘要&#xff1a; 本文将介绍如何在Go语言项目中使用YAML文件来管理配置&#xff0c;包括如何读取YAML文件以及如何在代码中解析和使用这些配置。 正文&#xff1a; 在编程世界中&#xff0c;配置管理是每个项目都必须面对的问题。对于Go语言项目来说&#xff0c;YAML文件是一…...

STM32高级控制定时器之输入捕获模式

目录 概述 1 输入捕获模式 1.1 原理介绍 1.2 实现步骤 1.3 发生输入捕获流程 2 使用STM32Cube配置工程 2.1 软件环境 2.2 配置参数 2.3 生成项目文件 3 功能实现 3.1 PWM调制占空比函数 3.2 应用函数库 4 测试 4.1 功能框图 4.2 运行结果 源代码下载地址&#xf…...

使用 Vue 3 和 qrcode.js 开发二维码显示组件

二维码在现代应用中广泛使用&#xff0c;例如支付、身份验证、链接分享等。本文将介绍如何使用 Vue 3 和 qrcode.js 库来创建一个灵活的二维码显示组件&#xff0c;并展示如何在应用中使用它。 1. 安装必要的依赖 首先&#xff0c;我们需要安装 Vue 3 和 qrcode.js。如果你还…...

LabVIEW异步编程概述

LabVIEW异步编程是一种在图形化编程环境中处理并行任务的方法。通过异步执行&#xff0c;可以提高程序的响应速度和资源利用效率&#xff0c;使得多个任务可以独立进行而不互相干扰。 原理 LabVIEW异步编程的核心在于使用异步调用节点&#xff08;Asynchronous Call By Refer…...

【数据库】MySQL表的操作

目录 一.创建表 二.查看表 三.修改表 四.删除表 一.创建表 基本语法&#xff1a; CREATE TABLE table_name(field1 datatype,field2 datatype,field3 datatype) character set 字符集 collate 校验规则 engine 储存引擎field表示列名 datatype表示列的类型 charatcer se…...

【mybatis解决oracle查询in超过1000条数据】

1、因为代码中前人未考虑in 数据可能大于1000&#xff0c;导致现在系统报错&#xff0c;MPP low前人 直接上sql select * from table a <where><if test"list ! null and list.size > 0">and a.name in<foreach collection"list" inde…...

EasyExcel之动态表头导出不生效

今天接到一个优化需求&#xff0c;表格导出后的表头顺序和页面不一致&#xff0c;要优化成一致的。根据传入的字段&#xff0c;动态导出数据&#xff0c;并保证顺序。 我看到导出的实体类都有ExcelProperty注解&#xff0c;同时也在官网查看了这注解的含义和使用。 ExcelPrope…...

appium元素定位工具_uiautomatorviewer.bat

特点&#xff1a; uiautomatorviewer是android-sdk自带的元素定位工具uiautomatorviewer只能用于安卓系统&#xff1b;它是通过截屏分析XML布局文件方式&#xff0c;来提供控件信息的查看服务 uiautomatorviewer.bat 基本使用 路径&#xff1a;这个工具是Android SDK中自带&…...

手机离线翻译哪个好?断网翻译也能超丝滑

有时在异国他乡&#xff0c;面对语言不通的窘境&#xff0c;即便是简单的对话也变得异常困难&#xff0c;真是挑战满满&#xff01; 然而&#xff0c;能离线翻译的软件让语言障碍不再是问题&#xff0c;不必依赖网络也能轻松进行翻译啦~ 只需下载所需的语言包&#xff0c;选择…...

神器!!Python热重载调试【送源码】

在 Python 开发的路上&#xff0c;调试是我们不可避免的一环。 而今天推荐的开源项目Reloadium &#xff0c;让你在不重启程序的情况下实现代码的即时更新和调试。 &#x1f504; Reloadium 功能亮点&#xff1a; 1. 热重载魔法&#xff1a; Reloadium 不仅仅能够实现代码的…...

Flutter基础 -- Dart 语言 -- 列表集合枚举

目录 1. 列表 List 1.1 初始 1.2 声明 1.2.1 自动 1.2.2 定长 1.2.3 生成数据 1.3 属性 1.4 方法 1.4.1 添加 1.4.2 查询 1.4.3 删除 1.4.4 Range 1.4.5 洗牌 1.4.6 排序 1.4.7 复制子列表 1.4.8 操作符 2. 集合 Map 2.1 初始 2.2 声明 2.2.1 松散 2.2.2 …...

怎么花草识别?方法有三种!

怎么花草识别&#xff1f;在这个五彩斑斓的世界里&#xff0c;花草是我们生活中不可或缺的一部分。它们点缀着我们的环境&#xff0c;为我们带来无尽的美丽与惊喜。然而&#xff0c;面对众多的花草种类&#xff0c;你是否曾感到困惑和迷茫&#xff0c;不知道如何识别它们&#…...

【qt】自定义对话框

自定义对话框 一.自定义对话框的使用1.应用场景2.项目效果3.界面拖放4.模型和视图的设置5.action功能实现 二.自定义对话框的创建1.设置对话框界面2.创建对话框 三.对话框的功能与样式实现1.对话框数据的交换2.对话框的显示3.设置对话框的特性4.完成按钮的功能 四.编辑表头的对…...

汽车IVI中控开发入门及进阶(二十二):video decoder视频解码芯片

前言: 视频解码器在许多汽车、专业和消费视频应用中仍有需求。Analog Devices是模拟视频产品领域的行业领导者,提供一系列视频解码器,可将标准(SD,standard definition)和高清(HD,High definition)分辨率的模拟视频高质量转换为MIPI或TTL格式的数字视频数据。典型的应…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...