今天编译一个程序,需要引入自己写的一个库(.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
就不会报错。
这个问题真是令我困惑,不知道到底什么原因产生这种问题。
分享到:
相关推荐
linux 静态库的使用
在 centos 7 下使用 gcc 4.8.5 + cmake 3.16.9 编译,包含 bin, include, lib, lib64, share 五个目录,可以直接在 linux C++ 程序中引用。 因为 grpc 编译比较麻烦,且依赖项较多,故而分享一下编译后的版本,本人...
创建步聚:创建项目-》先lib选项,一直Next,根据实例写库,构建生成.so库。 调用:右键添加外部库-》修改pro文件-》添加头文件-》创建对象-》调用应库函数。
linux 库文件的建立和使用资料 linux下的库有两种:静态库和共享库(动态库)。 二者的不同点在于代码被载入的时刻...共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
vs2015跨平台linux开发so库例子,http://www.cnblogs.com/jiftle/p/8401887.html
一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到 库的搜索路径之中。...
linux 动态库测试程序,用于生成动态库,并进行引用。研究objdump输出格式。
从程序编写、编 译、调用以及对操作系统依赖等方面综合分析比较了这两种调用方式的不同之处,根据实际程序移植经验,给出了将VC++编制的Windows动态库移植到 Linux下的方法以及需要注意的问题,同时并给出了程序示例...
在 ubuntu 下使用 gcc 4.8.5 + cmake 3.28 编译,包含 bin, include, lib, lib64, share 五个目录,可以直接在 linux C++ 程序中引用。 因为 grpc 编译比较麻烦,且依赖项较多,故而分享一下编译后的版本,本人在 ...
1.什么是库 在windows平台和linux平台下都大量存在着库。... 共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。 3.库存在的意义 库是别人写
2、附带grpc linux库文件 3、史上最靠谱的grpc库文件使用方法。(网上搜索方法都跑不起来,让人无语) 4、如有任何问题,可通过添加微信讨论。微信账号为个人电话,可在个人资料当中查找 5、本资源在ubuntu20.04,...
在链接动态库生成可执行文件时,并不会把动态库的代码复制到执行文件中,而是在执行文件中记录对动态库的引用。 程序执行时,再去加载动态库文件。如果动态库已经加载,则不必重复加载,从而能节省内存空间。 ...
opencv用于支持linux的x86,x64平台的引用包(注:javacv引用该包不再需要额外安装opencv)
现在讲述如何写makefile的文章比较少,通过本教程可以快速掌握makefile的编写
在启动应用程序之前,动态链接器将所需的共享库映射到应用的内存, 或者使用系统共享的目标并为应用程序解析所需的外部引用。 Linux动态连接1.Linux中的应用程序以以下两种方式之一链接到外部函数 -> 在构建时与...
SQLite数据库.net引用库 System.Data.SQLite.dll(通用版,32位,64位系统均支持)
压缩包中2个库 一个是ubuntu的 一个是arm的 已编译好 直接引用就可以了 gcc terminal.c -o a.out -I /root/zeromq/include -L /root/zeromq/lib -lzmq -DZMQ_BUILD_DRAFT_API 或arm-linux-gnueabihf-gcc terminal.c ...
和库 86 5.13 小结 87 第二部分 服务配置 第6章 系统的启动和关闭 89 6.1 引导进程 89 6.2 初始化进程和启动脚本 90 6.2.1 init和/etc/inittab 90 6.2.2 /etc/inittab和系统状态 92 6.3 linuxconf与管理服务 96 6.4...
在链接动态库生成可执行文件时,并不会把动态库的代码复制到执行文件中,而是在执行文件中记录对动态库的引用。 程序执行时,再去加载动态库文件。如果动态库已经加载,则不必重复加载,从而能节省内存空间。 Linux...
用于将共享库注入Linux或Windows进程的库 Linux 注意:请勿在生产环境中使用此库。 这可能会永远停止进程。 请参阅。 我受到启发,基本思想由此而来。 但是,在libc.so.6调用__libc_dlopen_mode的方式完全不同。 ...