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

linux项目_c语言:Makefile编写、动态库生成、添加动态库路径

一直想搞懂Linux中Makefile是怎么管理项目的,知识积累到一定程度后,我就做了一个自己的缩小项目去把剩下的细节搞清楚

代码:

Service.c:

#include <stdio.h>
#include "lib_sevr.h"
int main(){printf("输入a, b的值:\n");double a, b;scanf("%lf %lf", &a, &b);printf("%lf + %lf = %.1f\n", a, b, add(a, b));return 0;
}

lib_sevr.c:

#include "lib_sevr.h"double add(double a, double b){return a + b;
}

lib_sevr.h:

#ifndef __LIB_SEVR__H__
#define __LIB_SEVR__H__double add(double a, double b);#endif  //!__LIB_SEVR__H__

项目.c文件的大致位置关系是这样的:

在这里插入图片描述

编译涉及到路径问题

gcc -fpic -shared -I../Client/ lib_sevr.c -o libsevr.so 
# 生成与路径无关的动态库,-I是指定头文件路径
vi /etc/profile
export LD_LIBRARY_PATH=/home/saisi/Desktop/Cproject/Server/
# 进入配置.so动态库的环境变量路径
source /etc/profile
#读取路径
#最好再重启一下,因为读取是只对本终端有效,退出后又要重新读取

因为动态库并不是写入可执行程序里的,可执行程序里只有动态库的链接,加载器在执行到相应位置后得通过这些环境变量找到动态库路径

gcc -o main -I../Client/ Server.c libsevr.so
# 将动态库链接到主函数,并生成可执行文件,-I仍是指定.h文件位置

在这里插入图片描述

可以执行,那么将上述编译操作写到Makefile文件中即可

# ~/Desktop/Cproject$ 
all:$(MAKE) -C Serverclean:rm -f ./Server/main ./Server/*.so
#~/Desktop/Cproject/Server$ 
all: MAINMAIN: Server.c libsevr.sogcc -o main -I../Client/ Server.c libsevr.solibsevr.so: lib_sevr.cgcc -fpic -shared -I../Client/ lib_sevr.c -o libsevr.so 

当然还Makefile可以再优化

相关文章:

linux项目_c语言:Makefile编写、动态库生成、添加动态库路径

一直想搞懂Linux中Makefile是怎么管理项目的&#xff0c;知识积累到一定程度后&#xff0c;我就做了一个自己的缩小项目去把剩下的细节搞清楚 代码&#xff1a; Service.c: #include <stdio.h> #include "lib_sevr.h" int main(){printf("输入a, b的值…...

Python学习(1):字典、DataFrame的创建方法

1. 字典的创建方法 1.1 直接创建 # 创建一个包含姓名和年龄的字典 person {"name": "Alice", "age": 25}print(person) # 输出&#xff1a;{name: Alice, age: 25} 1.2 使用 dict() 函数 # 使用键值对列表创建字典 person dict(name"…...

async await 介绍 从0手动实现async await

1 async await介绍 async 和 await 是用于处理异步编程的语法糖&#xff0c;它们简化了异步操作的编写&#xff0c;使其看起来像同步代码。通过 async 标记一个函数为异步函数&#xff0c;返回的是一个 Promise 对象&#xff0c;而 await 用来暂停执行&#xff0c;直到 Promise…...

UDP校验和计算及网络中的校验和机制

UDP (User Datagram Protocol) 是一种无连接的传输层协议&#xff0c;它不像 TCP 那样提供可靠的传输保证。虽然 UDP 不保证数据可靠性&#xff0c;但它仍然提供了一个可选的校验和机制来检测数据在传输过程中出现的错误。 理解UDP校验和的计算过程和其在网络中的作用至关重要。…...

如何使用C语言接入Doris数据库

如何使用C语言接入Doris数据库 一、环境准备1. 安装MySQL C API2. Doris数据库环境二、编写C语言接入代码1. 包含必要的头文件2. 编写连接和查询函数3. 编译和运行程序三、注意事项1. 安全性2. 错误处理3. 性能优化4. 兼容性5. 调试和日志记录四、结论Doris(之前称为Palo或Apa…...

DarkLabel 2.4 目标追标注工具介绍

DarkLabel介绍 https://github.com/darkpgmr/DarkLabel 官方地址 视频/图像标注工具&#xff0c;很适合用于目标追踪任务 DarkLabel可以在视频和图像中标注物体的边界框&#xff0c;并附上 ID 和name。还可以用于裁剪视频、从视频中采样训练图像以及对图像区域进行马赛克处理…...

uniapp设置从右上角到左下角的三种渐变颜色

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…...

Python 解析 html

一、场景分析 假设有如下 html 文档&#xff1a; 写一段 python 脚本&#xff0c;解析出里面的数据&#xff0c;包括经度维度。 <div classstorelist><ul><li lng"100.111111" lat"10.111111"><h4>联盟店1</h4><p>…...

“大数据+高职”:VR虚拟仿真实训室的发展前景

随着信息技术的迅猛发展&#xff0c;大数据技术与虚拟现实&#xff08;VR&#xff09;的融合正在为高等教育&#xff0c;尤其是高等职业教育&#xff08;高职&#xff09;带来革命性的变革。VR虚拟仿真实训室作为这一技术融合的典型应用&#xff0c;正逐步展现其在提升教育质量…...

Pygame中Sprite实现逃亡游戏4

在《Pygame中Sprite实现逃亡游戏3》中实现了玩家跳跃飞火的效果&#xff0c;接下来通过精灵类的碰撞检测来判断飞火是否击中玩家、飞火是否击中飞龙以及飞龙是否抓住玩家。 1 飞火是否击中玩家的判断 判断飞火是否击中玩家的代码如图1所示。 图1 判断飞火是否击中玩家的代码 …...

sentinel原理源码分析系列(一)-总述

背景 微服务是目前java主流开发架构&#xff0c;微服务架构技术栈有&#xff0c;服务注册中心&#xff0c;网关&#xff0c;熔断限流&#xff0c;服务同学&#xff0c;配置中心等组件&#xff0c;其中&#xff0c;熔断限流主要3个功能特性&#xff0c;限流&#xff0c;熔断&…...

创建数据/采集数据+从PI数据到PC+实时UI+To PLC

Get_Data ---------- import csv import os import random from datetime import datetime import logging import time # 配置日志记录 logging.basicConfig(filename=D:/_Study/Case/Great_Data/log.txt, level=logging.INFO, format=%(asctime)s - %(l…...

Linux基础入门 --12 DAY(SHELL脚本编程基础)

shell脚本编程 声明&#xff1a;首行shebang机制 #!/bin/bash #!/usr/bin/python #!/usr/bin/perl 变量 变量类型 变量类型&#xff1a; 内置变量 : 如 PS1 , PATH ,HISTSIZE 用户自定义变量 不同变量存放数据不同&#xff0c;决定了以下 1.数据存储方式 2.参与的运算 3.表示…...

关于frp Web界面-----frp Server Dashboard 和 frp Client Admin UI

Web 界面 官方文档&#xff1a;https://gofrp.org/zh-cn/docs/features/common/ui/ 目前 frpc 和 frps 分别内置了相应的 Web 界面方便用户使用。 客户端 Admin UI 服务端 Dashboard 服务端 Dashboard 服务端 Dashboard 使用户可以通过浏览器查看 frp 的状态以及代理统计信…...

Hive数仓操作(一)

Hive 介绍 Hive 是一个基于 Hadoop 的数据仓库工具&#xff0c;旨在简化大规模数据集的管理和分析。它将结构化数据文件映射为表&#xff0c;并提供类似 SQL 的查询功能。Hive 的数据存储在 Hadoop 分布式文件系统&#xff08;HDFS&#xff09;中&#xff0c;使用 Hive 查询语…...

什么是NAND Flash?

什么是NAND Flash? NAND闪存是一种非易失性存储器技术&#xff0c;它彻底改变了数字时代的数据存储。它是闪存的一种形式&#xff0c;这意味着它可以被电擦除和重新编程。NAND闪存以NAND&#xff08;NOT-AND&#xff09;逻辑门命名&#xff0c;该逻辑门用于其基本架构。术语“…...

Spring Boot 整合 Keycloak

1、概览 本文将带你了解如何设置 Keycloak 服务器&#xff0c;以及如何使用 Spring Security OAuth2.0 将 Spring Boot 应用连接到 Keycloak 服务器。 2、Keycloak 是什么&#xff1f; Keycloak 是针对现代应用和服务的开源身份和访问管理解决方案。 Keycloak 提供了诸如单…...

工程师 - Windows下使用WSL来访问本地的Linux文件系统

Access Linux filesystems in Windows and WSL 2 从 Windows Insiders 预览版构建 20211 开始&#xff0c;WSL 2 将提供一项新功能&#xff1a;wsl --mount。这一新参数允许在 WSL 2 中连接并挂载物理磁盘&#xff0c;从而使您能够访问 Windows 本身不支持的文件系统&#xff0…...

SQL高可用优化-优化SQL中distinct和Where条件对索引字段进行非空检查语句

最近做一个需求&#xff0c;关于SQL高可用优化&#xff0c;需要优化项目中的SQL&#xff0c;提升查询效率。 SQL高可用优化 一、优化SQL包含distinct场景二、优化SQL中Where条件中索引字段是否为NULL三、代码验证1. NodeMapper2. NodeService3. NodeController4.数据库数据5.项…...

openharmony源码编译

1. win拷贝数据到虚拟机Ubuntu配置 1.打开终端&#xff0c;更新软件库 sudo apt-get update 2.下载安装open-vm-tools&#xff0c;open-vm-tools-desktop sudo apt-get install open-vm-tools open-vm-tools-desktop 3.重启 sudo reboot 2.编译环境配置 1.设置环境脚本…...

ESP8266轻量级按钮状态MQTT同步库

1. 项目概述BartOS-button-online是为 BartOS 物联网操作系统设计的轻量级按钮状态在线同步库&#xff0c;专用于资源受限的 ESP8266 平台&#xff08;如 ESP-01、NodeMCU&#xff09;&#xff0c;并兼容 Arduino Core for ESP8266 开发环境。该库不提供独立的 UI 或 Web 服务&…...

5个环保主题HTML网页设计实战:从零到一构建绿色网站

1. 环保主题网页设计入门指南 第一次接触环保主题网页设计时&#xff0c;我盯着空白的编辑器整整半小时不知从何下手。直到看到某公益组织的网站&#xff0c;才发现原来绿叶图标和自然色系能瞬间传递环保理念。对于前端新手来说&#xff0c;这类主题最大的优势在于视觉元素明确…...

从原理到实战:AEC如何成为现代通信的“静音守护者”

1. 回声&#xff1a;从自然现象到通信难题 想象一下&#xff0c;你正在和远方的朋友视频通话&#xff0c;突然听到自己的声音像山谷回音一样不断重复。这种恼人的现象就是我们常说的"声学回声"。在自然界中&#xff0c;回声是声音遇到障碍物反射形成的物理现象&#…...

Legacy iOS Kit终极指南:轻松完成旧款iOS设备降级与恢复

Legacy iOS Kit终极指南&#xff1a;轻松完成旧款iOS设备降级与恢复 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit Lega…...

Qwen1.5-1.8B GPTQ开发环境配置:IntelliJ IDEA插件开发初探

Qwen1.5-1.8B GPTQ开发环境配置&#xff1a;IntelliJ IDEA插件开发初探 如果你是一名Java开发者&#xff0c;对AI大模型感兴趣&#xff0c;想在自己的IDE里搞点“智能”新花样&#xff0c;那么你来对地方了。今天我们不聊复杂的模型训练&#xff0c;也不讲高深的算法原理&…...

InternLM2-Chat-1.8B多场景落地:跨境电商产品描述生成+多语言翻译实战

InternLM2-Chat-1.8B多场景落地&#xff1a;跨境电商产品描述生成多语言翻译实战 1. 跨境电商的痛点与AI解决方案 跨境电商卖家每天面临着一个共同的挑战&#xff1a;如何为成千上万的商品快速生成高质量的产品描述&#xff0c;并且还要满足不同语言市场的需求。传统的人工撰…...

Spring Batch 大数据量处理实战:从入门到精通

Spring Batch 大数据量处理实战&#xff1a;从入门到精通别叫我大神&#xff0c;叫我 Alex 就好。处理百万级数据不用愁&#xff0c;Spring Batch 让批处理变得优雅而高效。一、Spring Batch 基础架构 1.1 核心配置 Configuration EnableBatchProcessing public class BatchCon…...

广东省内推荐靠谱的知识产权服务机构

在广东省&#xff0c;随着创新驱动发展战略的深入实施&#xff0c;知识产权的重要性日益凸显。无论是企业还是个人&#xff0c;都越来越重视知识产权的保护和运用。选择一家靠谱的知识产权服务机构至关重要&#xff0c;它能为客户提供专业、高效的服务&#xff0c;助力客户在知…...

Vivado实战:从零封装自定义接口IP核的完整流程

1. 为什么需要封装自定义IP核 第一次接触FPGA开发时&#xff0c;我总喜欢把整个工程的所有代码都堆在一个项目里。直到某天需要复用之前的HDMI显示模块时&#xff0c;才发现要手动复制几十个文件&#xff0c;还得逐个修改端口连接。这种重复劳动让我意识到&#xff1a;封装IP核…...

VRCX:重新定义VRChat社交管理的智能伴侣工具

VRCX&#xff1a;重新定义VRChat社交管理的智能伴侣工具 【免费下载链接】VRCX Friendship management tool for VRChat 项目地址: https://gitcode.com/GitHub_Trending/vr/VRCX 在虚拟社交平台VRChat的生态中&#xff0c;社交关系管理常常成为用户体验的痛点。传统方式…...