makefile 设置动态库路径参数

目录

  • 一、makefile 动态库相关
    • 1.1 Libs 变量
    • 1.2 LDFLAGS 变量
    • 1.3 二者的作用和区别
  • 二、设置方式
    • 2.1 编译时指定库路径
    • 2.2 运行时指定库路径
  • 三、测试

一、makefile 动态库相关

1.1 Libs 变量

在 Makefile 中,Libs 通常是一个变量,用于存储链接器(linker)在生成可执行文件或库文件时需要使用的库文件列表及其相关选项。这些库文件可能包括静态库(.a 文件)和动态库(.so 文件,在 Unix-like 系统上)。
Libs 变量的具体用途和定义方式可能会因项目而异,但一般来说,它包含了以下几个方面的信息:
1、库文件路径:如果库文件不在标准的库搜索路径中(如 /usr/lib 或 /usr/local/lib),则需要使用 -L 选项来指定库文件的路径。这个路径会被添加到链接器的搜索路径列表中。
2、库文件名称:使用 -l 选项来指定链接器需要链接的库文件。链接器会在这个选项指定的名称前加上 lib 前缀和适当的文件扩展名(如 .so 或 .a),然后在库搜索路径中查找这个文件。
3、其他链接选项:有时,链接器需要一些额外的选项来正确地链接库文件,比如指定特定的链接器脚本或处理特定的库依赖关系。
在 Makefile 中定义 Libs 变量的一个示例如下:
库文件名称:使用 -l 选项来指定链接器需要链接的库文件。链接器会在这个选项指定的名称前加上 lib 前缀和适当的文件扩展名(如 .so 或 .a),然后在库搜索路径中查找这个文件。
其他链接选项:有时,链接器需要一些额外的选项来正确地链接库文件,比如指定特定的链接器脚本或处理特定的库依赖关系。

# 定义库文件路径和名称
Libs = -L/path/to/libs -lmylibrary -anotherlibrary# ... 其他 Makefile 内容 ...# 链接目标文件和库文件生成可执行文件
myexecutable: myobjectfile.o$(CC) $(LDFLAGS) myobjectfile.o $(Libs) -o myexecutable

在这个例子中,Libs 变量包含了 -L/path/to/libs(指定库文件路径)和 -lmylibrary -anotherlibrary(指定库文件名称)。在链接目标文件 myobjectfile.o 生成可执行文件 myexecutable 时,这些选项会被传递给链接器。
需要注意的是,Libs 变量的名称并不是 Makefile 的标准部分,它的命名和使用完全取决于项目或开发者的约定。有些项目可能会使用不同的变量名(如 LDLIBS)来存储链接器选项。因此,在查看或编写 Makefile 时,最好先了解项目的约定和命名习惯。

1.2 LDFLAGS 变量

Makefile 中,也可以使用 LDFLAGS 变量,该变量 包含了 -L/path/to/lib 和 -lmylib,前者指定库路径,后者指定库名。

# Compiler and flags
CC = gcc
CFLAGS = -Wall -g
LDFLAGS = -L/path/to/lib -lmylib# Source and object files
SRC = main.c
OBJ = $(SRC:.c=.o)# Executable name
EXEC = myprogram# Default target
all: $(EXEC)# Rule to make the executable
$(EXEC): $(OBJ)$(CC) $(OBJ) -o $(EXEC) $(LDFLAGS)# Rule to make the object file
%.o: %.c$(CC) $(CFLAGS) -c $< -o $@# Clean up
clean:rm -f $(OBJ) $(EXEC)

1.3 二者的作用和区别

在 Makefile 中,Libs 和 LDFLAGS 都是用于控制链接过程的变量,但它们的作用和用法有所不同。
Libs 的作用
Libs 通常用于指定链接器需要链接的库文件列表。这些库文件可能包括静态库(.a 文件)和动态库(.so 文件)。Libs 变量的值通常包含 -l 选项,用于指定库文件的名称(不包括 lib 前缀和文件扩展名)。此外,如果库文件不在标准的库搜索路径中,还需要使用 -L 选项来指定库文件的路径,但这个路径通常不会直接放在 Libs 变量中,而是放在 LDFLAGS 变量中(尽管这不是强制的,具体取决于项目的约定)。

LDFLAGS 的作用
LDFLAGS 用于指定链接器选项,这些选项会影响链接过程的行为。LDFLAGS 可以包含多种类型的选项,包括但不限于:

  • -L 选项:指定库文件的搜索路径。
  • -l 选项:虽然通常放在 Libs 变量中,但有时也可以放在 LDFLAGS 中(这取决于项目的约定)。
  • -Wl, 选项:将后续的选项传递给链接器。例如,-Wl,-rpath,/path/to/lib 会将 /path/to/lib 添加到可执行文件的运行时库搜索路径中。
  • 其他链接器特定的选项:这些选项可能因链接器的不同而有所不同,用于控制链接过程的各个方面。
    区别
    1、用途不同:Libs 主要用于指定需要链接的库文件,而 LDFLAGS 用于指定链接器的选项,这些选项可能包括库文件的搜索路径、运行时库搜索路径、以及其他链接器特定的行为。
    2、内容不同:Libs 通常只包含 -l 选项(和可能的 -L 选项,但这不是标准做法),而 LDFLAGS 可以包含多种类型的链接器选项。
    3、灵活性不同:由于 LDFLAGS 可以包含多种类型的选项,因此它比 Libs 更加灵活和强大。通过 LDFLAGS,可以控制链接过程的许多方面,而 Libs 则主要关注于库文件的链接。

在编写 Makefile 时,通常会将库文件的名称放在 Libs 变量中,而将库文件的搜索路径和其他链接器选项放在 LDFLAGS 变量中。然而,这并不是绝对的,具体取决于项目的约定和链接器的要求。在某些情况下,可能会看到 -L 选项被放在 Libs 变量中,或者 -l 选项被放在 LDFLAGS 中,这取决于项目的具体实现和链接器的行为。因此,在查看或编写 Makefile 时,最好先了解项目的约定和链接器的要求。

二、设置方式

2.1 编译时指定库路径

在编译时,需要使用 -L 选项来指定库的搜索路径,使用 -l 选项来指定库名(不包括前缀 lib 和文件扩展名 .so 或 .a)。

# Compiler and flags
CC = gcc
CFLAGS = -Wall -g
LDFLAGS = -L/path/to/lib -lmylib# Source and object files
SRC = main.c
OBJ = $(SRC:.c=.o)# Executable name
EXEC = myprogram# Default target
all: $(EXEC)# Rule to make the executable
$(EXEC): $(OBJ)$(CC) $(OBJ) -o $(EXEC) $(LDFLAGS)# Rule to make the object file
%.o: %.c$(CC) $(CFLAGS) -c $< -o $@# Clean up
clean:rm -f $(OBJ) $(EXEC)

在这个 Makefile 中,LDFLAGS 变量包含了 -L/path/to/lib 和 -lmylib,前者指定库路径,后者指定库名。

2.2 运行时指定库路径

在运行时,系统需要知道在哪里找到这些动态库。这可以通过设置 LD_LIBRARY_PATH 环境变量来实现。
命令行手动设置

export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH
./myprogram

也可以在 Makefile 中添加一个目标来设置这个环境变量并运行的程序:

# Run the executable with LD_LIBRARY_PATH set
run: $(EXEC)LD_LIBRARY_PATH=/path/to/lib:$$LD_LIBRARY_PATH ./$(EXEC)

可以通过运行 make run 来编译并运行程序,同时确保 LD_LIBRARY_PATH 已正确设置。

三、测试

以snap7 动态库为例,将 动态库 放置在 /home/user/Desktop/snap7 文件下。
工程结构如下:
在这里插入图片描述
makefile 文件如下:

##
## LINUX barebone makefile for c examples : good for all platforms
##
## Simply run make or make clean
##
## Intend this makefile only as a "batch examples updater" after library modification.
##
LDFLAGS  := -L/home/user/Desktop/snap7
Libs     := -lsnap7 CXX      := arm-linux-g++
CC       := arm-linux-gcc
#CXXFLAGS :=-O3
CFLAGS   :=.PHONY: all cleanall: $(CC) $(CFLAGS) -o client ./client.c $(LDFLAGS) $(Libs) clean:$(RM) client

指令 make
在这里插入图片描述
可看到动态库被正确链接编译。生成可执行文件 clinet。
在这里插入图片描述
刚开始编译时遇到问题,提示:

/usr/bin/ld: skipping incompatible......

在这里插入图片描述
这个问题实质是链接库文件时,库文件版本与平台版本不对应的问题。
解决方法:

objdump -p libsnap7.so  

看一下该库的版本是32为还是64位的,或是ARM版还是…等等。
在这里插入图片描述
在这里插入图片描述
使用 arm-linux工具链编译即可。

参考
Linux关于 PATH / LD_LIBRARY_PATH / LIBRARY_PATH环境变量的设置和区别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/471274.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Servlet入门 Servlet生命周期 Servlet体系结构

一.Servlet入门 1.Servlet介绍 Servlet (server applet) 是运行在服务端(tomcat)的Java小程序&#xff0c;是sun公司提供一套定义动态资源规范; 从代码层面上来讲Servlet就是一个接口 狭义的Servlet是指Java语言编写的一个接口。 广义的Servlet是指任何实现了这个Servlet接口…

穿越数据迷宫:C++哈希表的奇幻旅程

文章目录 前言&#x1f4d4;一、unordered系列关联式容器&#x1f4d5;1.1 unordered 容器概述&#x1f4d5;1.2 哈希表在 unordered 容器中的实现原理&#x1f4d5;1.3 unordered 容器的特点 &#x1f4d4;二、unordered_set 和 unordered_map 的基本操作&#x1f4d5;2.1 un…

飞牛云fnOS本地部署WordPress个人网站并一键发布公网远程访问

文章目录 前言1. Docker下载源设置2. Docker下载WordPress3. Docker部署Mysql数据库4. WordPress 参数设置5. 飞牛云安装Cpolar工具6. 固定Cpolar公网地址7. 修改WordPress配置文件8. 公网域名访问WordPress 前言 本文旨在详细介绍如何在飞牛云NAS上利用Docker部署WordPress&a…

2023年MathorCup数学建模B题城市轨道交通列车时刻表优化问题解题全过程文档加程序

2023年第十三届MathorCup高校数学建模挑战赛 B题 城市轨道交通列车时刻表优化问题 原题再现&#xff1a; 列车时刻表优化问题是轨道交通领域行车组织方式的经典问题之一。列车时刻表规定了列车在每个车站的到达和出发&#xff08;或通过&#xff09;时刻&#xff0c;其在实际…

安全见闻1-5

涵盖了编程语言、软件程序类型、操作系统、网络通讯、硬件设备、web前后端、脚本语言、病毒种类、服务器程序、人工智能等基本知识&#xff0c;有助于全面了解计算机科学和网络技术的各个方面。 安全见闻1 1.编程语言简要概述 C语言&#xff1a;面向过程&#xff0c;适用于系统…

闯关leetcode——3178. Find the Child Who Has the Ball After K Seconds

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/find-the-child-who-has-the-ball-after-k-seconds/description/ 内容 You are given two positive integers n and k. There are n children numbered from 0 to n - 1 standing in a queue in o…

Java结合ElasticSearch根据查询关键字,高亮显示全文数据。

由于es高亮显示机制的问题。当全文内容过多&#xff0c;且搜索中标又少时&#xff0c;就会出现高亮结果无法覆盖全文。因此需要根据需求手动替换。 1.根据es的ik分词器获取搜索词的分词结果。 es部分&#xff1a; //中文分词解析 post /_analyze {"analyzer":"…

Python——NumPy库的简单用法,超级详细教程使用

一、什么是NumPy库 NumPy&#xff1a;它是python的一个科学计算库函数&#xff0c;它是由c语言编写的 它应用于数据处理、机器学习、图像处理、文件操作等等 二、array函数 这里导入库numpy&#xff0c;命名为np&#xff0c;后面的np都是代表着是numpy函数 array函数表示创建…

【Java语言】String类

在C语言中字符串用字符可以表示&#xff0c;可在Java中有单独的类来表示字符串&#xff08;就是String&#xff09;&#xff0c;现在我来介绍介绍String类。 字符串构造 一般字符串都是直接赋值构造的&#xff0c;像这样&#xff1a; 还可以这样构造&#xff1a; 图更能直观的…

自由学习记录(21)

感觉反而 还复杂一点&#xff0c;关系并不纯粹&#xff0c;游戏里用的少...的确 是知道为什么游戏不用了 理解思想就可以了&#xff0c;实际操作也是动态的分析&#xff0c;硬套某种模式也不是怎么很合适 MVC的了解应该是差不多了&#xff0c;重点还是实际中的使用了 所以删了…

Bugku CTF_Web——点login咋没反应

Bugku CTF_Web——点login咋没反应 进入靶场 随便输个试试 看来确实点login没反应 抓包看看 也没有什么信息 看了下源码 给了点提示 一个admin.css try ?12713传参试试 拿到一个php代码 <?php error_reporting(0); $KEYctf.bugku.com; include_once("flag.php&q…

软件测试面试大全(含答案+文档)

1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&…

从华为到创业公司

我有一个朋友&#xff0c;在华为工作了很长一段时间&#xff0c;一年多前&#xff0c;他从华为出来到了一家创业公司。 周末趁着有时间&#xff0c;我跟他聊了下关于从华为到创业公司的一些问题&#xff0c;总结给大伙看看。 ▎1 在华为工作和在创业公司工作最大的差别是什么呢…

Linux网络——网络初识

目录 1. 认识协议 2. 协议的分层 3. OSI 七层模型 && TCP/IP 五层(四层)模型 4. 网络传输的基本流程 5. 以太网的通信原理 6. 数据的跨网络传播 7. 认识 IP 地址 ① IP 是什么 ② IP 与 MAC 的关系 ③ 为什么需要 IP 在谈及网络之前&#xff0c;我们要先对学…

React Hooks在现代前端开发中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 React Hooks在现代前端开发中的应用 React Hooks在现代前端开发中的应用 React Hooks在现代前端开发中的应用 引言 React Hooks …

执行flink sql连接clickhouse库

手把手教学&#xff0c;flink connector打通clickhouse大数据库&#xff0c;通过下发flink sql&#xff0c;来使用ck。 组件版本jdk1.8flink1.17.2clickhouse23.12.2.59 1.背景 flink官方不支持clickhouse连接器&#xff0c;工作中难免会用到。 2.方案 利用GitHub大佬提供…

【机器学习】如何配置anaconda环境(无脑版)

马上就要上机器学习的实验&#xff0c;这里想写一下我配置机器学习的anaconda环境的二三事 一、首先&#xff0c;下载安装包&#xff1a; Download Now | Anaconda 二、打开安装包&#xff0c;一直点NEXT进行安装 这里要记住你要下载安装的路径在哪&#xff0c;后续配置环境…

如何保护 Microsoft 网络免受中间人攻击

一名办公室工作人员收到了一封看似来自供应商的电子邮件&#xff0c;但该邮件被隔离了&#xff0c;用户请求将其释放。这封邮件看起来没什么问题&#xff0c;因此管理员释放了这封邮件。用户点击邮件查看内容&#xff0c;其中包括一张附加发票。 问题就从这里开始&#xff1a;…

Excel筛选的操作教程

用Excel整理数据时&#xff0c;常常要用到筛选功能&#xff0c;很多复杂的数据经过一定条件的筛选后就变得很清晰。筛选也是Excel的一个基本功能之一&#xff0c;你会使用这个功能吗&#xff1f;不会也没关系&#xff0c;接着往下看&#xff0c;接下来就来演示一些Excel表格筛选…

爬虫补环境案例---问财网(rpc,jsdom,代理,selenium)

目录 一.环境检测 1. 什么是环境检测 2.案例讲解 二 .吐环境脚本 1. 简介 2. 基础使用方法 3.数据返回 4. 完整代理使用 5. 代理封装 6. 封装所有使用方法 jsdom补环境 1. 环境安装 2. 基本使用 3. 添加参数形式 Selenium补环境 1. 简介 2.实战案例 1. 逆向目…