今天编译一个程序,需要引入自己写的一个库(.a)文件,但是在编译的时候总是报undefined reference to '××××××'。
检查Makefile,没发现原因。检查库文件,一切正常。找了很久发现竟然是Makefile里面引用的顺序问题。
Why???????
出问题的Makefile
LDFLAGS= -L./lib -lutil
$(CC) -o srv $(CFLAGS) $(LDFLAGS) $(SRV_OBJS)
没问题的Makefile
LDFLAGS= -L./lib -lutil
$(CC) -o srv $(SRV_OBJS) $(CFLAGS) $(LDFLAGS)
仅仅是位置的差别,难道Makefile里面的链接参数必须放在后面?
同样,在一个动态库编译的时候也发现了同样的问题,在动态库编译时引用了一个静态库
$(CC) $(LDFLAGS) -lutil -shared -o liboracle.so oracle/*.o
如果 -lutil放前面或者放在$(LDFLAGS)里面引用SO的时候就会报找不到util中的函数,但是改成下面这样:
$(CC) $(LDFLAGS) -shared -o liboracle.so oracle/*.o -lutil
就不会报错。
这个问题真是令我困惑,不知道到底什么原因产生这种问题。
分享到:
相关推荐
4. **执行再定位**:动态链接器执行必要的再定位步骤,包括处理全局偏移表(GOT)和过程链接表(PLT),以确保正确引用动态库中的函数。 5. **控制权返回**:完成所有准备工作后,控制权返回给初始程序,使其能够开始...
在Linux环境下,Boost库可以用于开发各种类型的应用程序,包括服务器端软件、桌面应用以及嵌入式系统。 编译Boost 1.68版本的库主要涉及以下几个步骤: 1. **下载与解压**:首先从Boost官方仓库...
总的来说,Linux下的Qt开发涉及到了项目管理、源码编写、库生成、外部库引用等多个环节。掌握这些技能,不仅可以帮助你高效地构建可复用的模块,还能提升你的C++和Qt应用开发能力。在实际工作中,你可能还需要考虑库...
在 centos 7 下使用 gcc 4.8.5 + cmake 3.16.9 编译,包含 bin, include, lib, lib64, share 五个目录,可以直接在 linux C++ 程序中引用。 因为 grpc 编译比较麻烦,且依赖项较多,故而分享一下编译后的版本,本人...
### Linux下.NET Core版本加载海康SDK库失败问题处理 #### 背景与问题概述 在使用.NET Core进行Linux平台下的二次开发时,可能会遇到加载海康SDK库失败的问题。这种情况下,开发者通常需要手动指定相关的动态链接...
在Linux操作系统中,库文件是实现程序功能复用的关键组件,分为静态链接库(.a文件)和动态链接库(.so文件)。这两种类型的库在程序编译和运行时有着不同的工作方式。 静态链接库(.a文件)在程序编译期间被链接器...
它解决了旧版操作系统与现代库之间的兼容问题,并且提供了一种无需安装完整OpenCV源码包就能使用其功能的方式。用户可以将这些动态库链接到他们的应用程序中,以便利用OpenCV进行图像处理、特征检测、物体识别等任务...
在Linux系统中,开发软件时常会遇到需要创建和使用动态库(.so)与静态库(.a)的情况。动态库允许多个程序共享同一份代码,节省内存资源,而静态库则将库代码直接编译进目标程序,不依赖外部环境。本篇将详细介绍在...
在Linux操作系统中,库扮演着至关重要的角色,它们是预先编译的代码集合,允许开发者重用和集成已经实现的功能,而无需从零开始编写代码。本文主要讨论两种类型的库:静态库和共享库(也称为动态库)。 首先,库是...
QCustomPlot的windows版本库和linux版本库。QCustomPlot是一个基于Qt C++的图形库,用于绘制和数据可视化 - 制作漂亮的2D图 - 曲线图、趋势图、坐标图、柱状图等,并为实时可视化应用程序提供高性能服务。它没有...
### 深入分析Windows与Linux动态库应用异同 #### 一、引言 在软件开发领域,动态链接库(Dynamic Link Library,简称DLL)技术是提高程序效率和灵活性的关键手段之一。无论是在Windows还是Linux这样的不同操作系统...
接下来,我们在 `test.c` 所在的文件夹中引用这个动态库进行编译: ```bash gcc -Wall -g -o test -L tools/ -ltool ``` 虽然这样的编译命令不会导致编译错误,但在运行时却可能会出现 `cannot open shared object...
2. **include**:此目录包含了OpenCV库的头文件,程序员在编写代码时会引用这些头文件来使用OpenCV的功能。例如,`#include <opencv2/opencv.hpp>` 是最常见的导入语句,它引入了OpenCV的主要功能。 3. **lib**:这...
动态库在运行时被加载,编译时仅保存对库的引用。这使得多个程序可以共享同一库,节省内存,但需要在运行环境中提供相应的库文件。 3. **库的意义** 库提高了代码复用性和开发效率,减少了重复劳动。它们包含了...
在Linux操作系统中,动态链接库(Dynamic Linking Library,通常以`.so`文件结尾)是一种共享的对象文件,它包含可由多个程序同时使用的代码和数据。动态链接库可以帮助节省内存,因为多个进程可以共享同一段内存...
总之,理解Linux动态库加载机制对于排查这类问题至关重要。通过仔细分析库的搜索路径、加载过程和重定位步骤,我们可以定位问题并找到解决方案。在实际操作中,应结合`ldd`、`readelf`、`strace`和`ldconfig`等工具...
当一个`.a`文件中嵌套另一个`.a`文件时,意味着一个静态库引用了另一个静态库的功能。这种做法在某些情况下是有用的,例如为了组织代码结构或减少编译链接时的复杂性。本项目提供了一个完整的示例,展示了如何创建和...
OpenCV(开源计算机视觉库)是一个跨平台的计算机视觉库,包含了众多图像处理和计算机...通过理解不同平台下的库文件及其用途,以及如何在项目中正确引用这些库,开发者可以有效地集成OpenCV,实现各种复杂的视觉任务。
1. **节省内存**:多个进程可以共享同一份库的内存空间,因为它们实际上都在引用相同的物理内存。 2. **版本更新**:当库更新时,只需替换.so文件,无需重新编译所有依赖该库的程序,便于维护和升级。 3. **延迟...