静态库调用静态库&静态库加载静态库------谈谈undefined reference to和linker input file unused because linking not done

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

          静态库可以调用静态库吗? 静态库可以加载静态库吗?  搞清这些东西, 对于linux开发很重要, 本文我们来探讨这些问题。

 

          先看程序:

          business.h:

#include <iostream>
using namespace std;

void business();

          business.cpp:

#include <iostream>
#include "business.h"
using namespace std;

void business()
{
	printf("business code\n");
}

        main.cpp

#include <iostream>
#include "business.h"
using namespace std;

int main()
{
    business();
    printf("main code\n");
}

       我们来编译运行看下:

 

xxxxxx:~/liblearn> g++ -c business.cpp
xxxxxx:~/liblearn> ar rcs libbusiness.a business.o
xxxxxx:~/liblearn> ls
business.cpp  business.h  business.o  libbusiness.a  main.cpp
xxxxxx:~/liblearn> g++ main.cpp -L. -lbusiness
xxxxxx:~/liblearn> ls
a.out  business.cpp  business.h  business.o  libbusiness.a  main.cpp
xxxxxx:~/liblearn> ./a.out 
business code
main code
xxxxxx:~/liblearn> 

 

       一切正常。

 

 

        我们再看看:

 

        basic.h

#include <iostream>
using namespace std;

void basic();

        basic.cpp

#include <iostream>
#include "basic.h"
using namespace std;

void basic()
{
    printf("basic code\n");
}

 

        business.h:

#include <iostream>
using namespace std;

void business();

        business.cpp:

#include <iostream>
#include "basic.h"
#include "business.h"
using namespace std;

void business()
{
    basic();
    printf("business code\n");
}

       main.cpp内容为:

#include <iostream>
#include "business.h"
using namespace std;

int main()
{
    business();
    printf("main code\n");

    return 0;
}

      来看看结果:

 

xxxxxx:~/liblearn> ls
basic.cpp  basic.h  business.cpp  business.h  main.cpp
xxxxxx:~/liblearn> g++ -c basic.cpp 
xxxxxx:~/liblearn> g++ -c business.cpp 
xxxxxx:~/liblearn> strings business.o | grep "basic code"
xxxxxx:~/liblearn> 
xxxxxx:~/liblearn> 
xxxxxx:~/liblearn> ar rcs libbasic.a basic.o
xxxxxx:~/liblearn> g++ -c business.cpp -L. -lbasic
g++: -lbasic: linker input file unused because linking not done
xxxxxx:~/liblearn> strings business.o | grep "basic code"
xxxxxx:~/liblearn> 
xxxxxx:~/liblearn> 
xxxxxx:~/liblearn> ar rcs libbusiness.a business.o
xxxxxx:~/liblearn> g++ main.cpp -L. -lbusiness
./libbusiness.a(business.o): In function `business()':
business.cpp:(.text+0x79): undefined reference to `basic()'
collect2: ld returned 1 exit status
xxxxxx:~/liblearn> 
xxxxxx:~/liblearn> 
xxxxxx:~/liblearn> g++ main.cpp -L. -lbusiness -lbasic
xxxxxx:~/liblearn> 
xxxxxx:~/liblearn> 
xxxxxx:~/liblearn> ./a.out 
basic code
business code
main code
xxxxxx:~/liblearn> strings a.out | grep "basic code"
basic code
xxxxxx:~/liblearn> 

       分析一下, 我们看到, 在编译business.cpp后, strings命令的结果没有basic code信息, 也就是business没有加载basic模块的任何东西, 因为这里只是编译, 没有链接. 即使主动链接一下, 也没有鸟用, 还会有warning提示linker input file unused because linking not done,   所以, 很自然地, g++ main.cpp -L. -lbusiness找不到basic, 很自然地需要g++ main.cpp -L. -lbusiness -lbasic, 这就带来了一个问题: libbusiness.a/business.h并不能独立地对外提供能力, 略蛋疼。

 

       怎么办呢? 这里可以考虑两种方法:

       a.  把libbasic.a库和libbusiness.a库合成新的libbusiness.a库, 但我个人不建议这么做。

       b.  专门为libbusiness.a搞一个宏, 使得每次链接libbusiness.a的时候, 自动也链接到libbasic.a,  这对于使用libbusiness.a的人来说, 是透明的, 不可见的, 不需要管的, 比较爽。

   

       综上所述: 

       1.  静态库 .a文件(这里更准确的说法应该是.o文件)不能加载其他静态库, 因为只涉及到编译,不涉及到链接。

       2.  静态库 .a文件(这里更准确的说法应该是.o文件)可以调用其他静态库(调用其中的函数), 此时并不会链接, 也不需要链接, 也链接不了。

           

 

        很多时候, 当我们的business模块要调用新的basic模块的静态库时, 要特别特别小心, 否则就会坑后面的同学, 后面同学在编译main的时候(或者其他so需要依赖于business静态库的时候), 肯定会undefined reference to xxx,  不好意思, 我曾经坑过两位同学大哭大哭

 

        其实, “加载”和“链接”的意思是差不多的。 好了, 本文先说道这里, 又有进步啦。

 

 

 

c语言静态库内存泄露检测,解决引用openssl静态库libcrypto.alibssl.a出现undefined reference to异常的有关问题... 解决引用openssl静态库libcrypto.alibssl.a出现undefined reference to错误的问题最近在做使用openssl链接httphttps的项目,编译时出现以下问题。/usr/local/openssl/lib/libcrypto.a(async.o): In function `async_free_pool_internal':async.c:(.text... 阅读详情

相关推荐

makefile报错:linker input file unused because linking not done

如上所示,在编译时候报错“linker input file unused because linking not done”;虽然提示编译成功了,但是实际生成的文件是空的,没有包含对应代码内容;出现这个的原因就是因为 .o 文件没有生成,可以再编译的时候注意观察一下有没有生成对应的 .o文件;然后进一步检查一下 gcc 的编译指令是否配置正确;大概率就是 gcc 的编译指令没对上导致的;

dujunqiu的博客 6287

关于makefile报错:linker input file unused because linking not done

原文地址:http://blog.sina.com.cn/s/blog_87c063060101ativ.html linker input file unusedbecause linking not done   GCC是Linux平台下常用的编译链接器。编译链接的过程分为: 源代码-->预处理文件(.i)-->编译后的汇编代码(.s)-->汇编后的二进制文件(.o

雜貨鋪 4万+

CMAKE编译报错 linker input file unused because linking not done

cmakelists 编译报错linker input file unused because linking not done,解决方法

qq_38170919的博客 2487

linux gcc编译器误用-MM导致出现linker input file unused because linking not done

昨晚深夜,音视频群有网友发消息给我,反馈我写的Makefile模板工程有一个bug,输入make之后,提示:linker input file unused because linking not done,并且没有生成a.out文件。 毕竟是自己一直维护的代码,出现bug就修正。

李迟的专栏 1万+

undefined reference问题总结

<br />最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func' <br />    关于undefined reference这样的问题,网上也有很多的说法,在此,我以详细地示例给出其中的各种原因说明以及解决方法,然后再给出我所遇到的与大家均不同的问题。<br />1.  链接时缺失了相关目标文件(.o)<br />    测试代码如下:<br />  <br />  

Listening_music的专栏 1万+

makefile报错:linker input file unused bacause linking not done

1.make后报错2.通过参考http://blog.sina.com.cn/s/blog_87c063060101ativ.html博客最终找出自己的错误    1)之前的maleficent文件        OBJS =  add/add_int.o add/add_float.o sub/sub_int.o sub/sub_float.o main.o        CFLAGS = -I...

BirdsLife的博客 5539

CMakeList静态库多层嵌套问题 undefined reference to

嵌套静态库 undefined reference to

u010647296的博客 3710

"undefined reference to" 问题解决方法

最近在 Linux 下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func’ 关于undefined reference 这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助。 1. 链接时缺失了相关目标文件(.o) 测试代...

KgdYsg的博客 9万+

undefined reference to“ 问题汇总及解决方法

编写测试代码如下:// test.h#endif// test.c{}// main.c{}先将test.c编译成库文件。将main.c编译成可执行文件。链接出错了,原因很简单,test()这个函数的声明定义不一致导致,将两者更改成一样即可通过编译。

zhanglidn013的专栏 3万+

Melis链接报错:undefined reference to(找不到某个函数

编译错误处理

houxiaoni01的博客 5855

gcc连接静态库成功 g++连接静态库undefined reference to''

mac下用g++编译代码,在连接一个c的静态库的时候,总是提示: undefined reference to`错误,找不到库函数。 main.c:(.text+0x15): undefined reference to `MemoryContextInit()' main.c:(.text+0x26): undefined reference to `MemoryContextDestory()...

with_dream的博客 2510

调用静态库,一直提示undefined reference to 问题解决

1 : 那就是没有 加入某库才提示的,,可以指定路径

Dablekai的专栏 1万+

gcc: warning: hello: linker input file unused because linking not done

在学习系统调用的时候想去追踪系统调用函数,就想把.c代码编译成汇编代码,执行以下操作: gcc -S -o hello.s hello 结果报错如下: 试着编译成可执行文件,执行以下操作: gcc -o hello.o hello 结果报错如下: 查阅资料,十个人有十种解决方法,试了几种还是不行,最后发现是源代码hello后缀不对,必须写成hello.c才能进行编译。问题解决! ...

qq_39748948的博客 5667

openssl静态库使用出错undefined reference to `COMP_CTX_new‘

有个项目又要用到openssl,在Linux下编译的时候没注意,报了以下错误 libcrypto.a(threads_pthread.o): In function `fork_once_func': threads_pthread.c:(.text+0x76): undefined reference to `pthread_atfork' libssl.a(ssl3_record.o): In...

发呆的程序猿 1万+

ffmpeg 静态库使用,undefined reference错误

ffmpeg移植到dm365上,遇到undefined reference错误: GA/gabin/lib/libavformat.a(allformats.o): In function `av_register_all': /GA/ffmpeg-0.10/libavformat/allformats.c:53: undefined reference to `avcodec_registe

激流中顽石 1万+

链接OpenCV静态库相关错误

./opencv3.4.13/lib/libopencv_core.a(persistence_c.cpp.obj): In function `cvOpenFileStorage_(CvFileStorage*&amp;, char const*, CvMemStorage*, int, char const*)': persistence_c.cpp:(.text._ZL18cvOpenFileStorage_RP13CvFileStoragePKcP12CvMemStorageiS3_+0xa0c):

Yemiekai的博客 5865

undefined reference to错误的解决方法

对于动态链接库,实际的符号定位是在运行期进行的.在编译.so的时候,如果没有把它需要的库他一起进行联编,比如libx.so 需要使用uldict, 但是忘记在编译libx.so的时候加上-luldict的话,在编译libx.so的时候不会报错,因为这个时候libx.so被认为是一个库,它里面存在一些不知道具体实现的符号是合法的,是可以在运行期指定或者编译另外的二进制程序的时候指定。一般情况链接的时候我们采用-L的方式指定查找路径,调用动态链接库的时候采用LD_LIBRARY_PATH的方式指定链接路径。

顺其自然~专栏 2万+

MockCpp介绍与应用实例

mock工具介绍mock工具的作用是指定函数的行为(模拟函数的行为)。可以对入参进行校验,对出参进行设定,还可以指定函数的返回值。几个相关概念(1)mock规范:每个MOCKER(function)开始,跟一系列的.stubs、.with、.will等的内容的整体,称为一个mock规范。(2)核心关键字:指stubs/defaults/expects/before/with/after/will/...

xunye的博客 5565
上一篇: “undefined reference to“ 问题汇总及解决方法 ------非常非常好的一篇文章
下一篇: 运行程序出现Illegal instruction的定位和思考------又是printf string惹的火
涛歌依旧
涛歌依旧 优质创作者: 后端开发技术领域 优质创作者: 后端开发技术领域 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄14年 28万+粉丝 2592原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值