关闭

结合xxx.cpp:(.text+0x55):对‘xxx’未定义的引用剖析Linux环境下动态库.so文件

标签: linux动态库so
3184人阅读 评论(0) 收藏 举报
分类:

操作系统:Linux系统

场景:g++编译,连接动态库文件时


错误示例(中文):

/tmp/cccgNNpb.o:在函数‘main’中:
test.cpp:(.text+0x55):对‘myprint()’未定义的引用


错误示例(英文):

/tmp/cccgNNpb.o: In function 'main':

test.cpp:(.text+0x55):undifined reference to 'myprint()'


分析:命令的格式正确,怎么就会出现未定义的情况?会不会是动态库的问题,因此,先手动写个动态库进行分析

头文件yxjay.h

#ifndef __YXJAY__
#define __YXJAY__

void myprint();

#endif
源码文件yxjay.c

#include <stdio.h>
#include "yxjay.h"
void myprint()
{
	printf("<span>oba没有马</span>\n");
}
测试主函数文件main.c

#include <stdio.h>
#include "yxjay.h"

int main(void)
{	
	
	myprint();
	return 0;
}

编译成动态库文件:

gcc -fPIC -shared yxjay.c -o libyxjay.so
编译主函数,并连接动态库

gcc -o main main.c -L ./ -lyxjay
其中-L为指定动态库路径, ./表示当前路径,也可以用-L.表示连接到当前路径

执行命令./main

发现报以下错误:

./main: error while loading shared libraries: libyxjay.so: cannot open shared object file: No such file or directory
用ldd main查看库依赖关系ldd main

root@yxjay:~/桌面# ldd main
    linux-vdso.so.1 (0x00007fff69961000)
    libyxjay.so => not found
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc42bf18000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fc42c2c3000)


发现动态库libyxjay.so并未加载到内存中。

原因是因为gcc连接动态库又连接到系统目录去了,可以使用以下命令暂时将当前目录加到系统目录中去(当前工作路径/root/桌面,libyxjay.so存放在该目录中),但是重启后就无效

ldconfig /root/桌面
或者将libyxjay.so文件加入系统的库文件目录中,默认搜索路径(/lib或者/usr/lib)以及动态库配置文件(/etc/ld.so.conf)

再次用ldd main查看库连接关系

root@yxjay:~/桌面# ldd main
    linux-vdso.so.1 (0x00007ffe405f7000)
    libyxjay.so => /root/桌面/libyxjay.so (0x00007fb64a5d9000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb64a22e000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fb64a7da000)

发现已经能找到libyxjay.so的入口了

执行命令./main也能正确显示出对应的结果

root@yxjay:~/桌面# ./main
oba没有马


前面的库文件是用gcc编译的,链接库时也是用gcc编译,那如果用g++编译连接gcc编译的库,结果如何呢?

用以下命令将main.c改成main.cpp

mv main.c main.cpp

然后用以下命令编译连接

g++ main.cpp -o main -L. -lyxjay

问题出现了:

root@yxjay:~/桌面# g++ main.c -o main -L. -lyxjay
/tmp/ccc4AcJv.o:在函数‘main’中:
main.c:(.text+0x5):对‘myprint()’未定义的引用
collect2: error: ld returned 1 exit status

居然显示未定义myprint()函数!但是明明已经在库中编译过了!!!

把main.cpp中的引用库文件代码改成extern “C"试试,改动后的代码如下:

#include <stdio.h>
extern "C"{
	#include "yxjay.h"
}
int main(void)
{	
	myprint();
	return 0;
}
再次编译

g++ main.cpp -o main -L. -lyxjay

编译成功,执行命令

root@yxjay:~/桌面# ./main
oba没有马

也能成功执行!


原因分析:gcc和g++分别对应的是C语音的变成和C++的编译,它们两者对函数名的编译方式不同,导致生成的符号也不一样,因此gcc编译的动态库和g++编译的动态库是不能完全等价的!c++调用gcc编译的动态库,头文件加上extern "C"就行,c调用g++编译的动态库??开玩笑吧!!


0
0
查看评论

编动态链接库时,提示 对‘dlopen’未定义的引用.该如何解决

编动态链接库时,提示 对‘dlopen’未定义的引用. 我按网上的方法写了个调用LINUX下的动态链接库的代码。代码如下。 #include   #include   using   namespace   std; int ...
  • lichen18848950451
  • lichen18848950451
  • 2017-03-14 19:41
  • 2311

g++编译时对'xxxx'未定义的引用问题(undefined reference to)

引用:http://www.linuxdiyf.com/linux/16754.html 在使用gcc编译的时候有时候会碰到这样的问题,编译为.o(obj) 文件没有问题,但是编译(这一步应该是链接)为可执行文件的时候会出现找不到’xxx’的定义的情况。 例如: g++ -o spider...
  • killwho
  • killwho
  • 2016-12-21 15:45
  • 6289

gcc编译时对’xxxx’未定义的引用问题

在使用gcc编译的时候有时候会碰到这样的问题,编译为.o(obj) 文件没有问题,但是编译(这一步应该是链接)为可执行文件的时候会出现找不到’xxx’的定义的情况。 例如: g++ -o spider -rdynamic -lpthread -levent -lcrypt -ldl bloomf...
  • bangdingshouji
  • bangdingshouji
  • 2017-04-11 12:56
  • 541

ubuntu gcc编译时对’xxxx’未定义的引用问题

http://www.cnblogs.com/oloroso/p/4688426.html gcc编译时对’xxxx’未定义的引用问题 原因解决办法 gcc 依赖顺序问题 在使用gcc编译的时候有时候会碰到这样的问题,编译为.o(obj) 文件没有问题...
  • haluoluo211
  • haluoluo211
  • 2017-01-12 13:05
  • 1773

Linux——gcc编译时In function `_start':(.text+0x**):

gcc编译会出现如下问题: In function `_start':(.text+0x****): undefined reference to `main'.... 下面是该类问题的解决方法:   例如: #include #include #incl...
  • u012627502
  • u012627502
  • 2015-03-04 19:02
  • 3294

编译Linux程序出现“对‘pthread_create’未定义的引用”

在学习Linux程序设计POXIS线程的时候,编译一个段简单的代码,就出现下面的错误: 1 /tmp/cc2FQJTh.o:在函数‘main’中: 2 1-thread.c:(.text+0x29):对‘pthread_create’未定义的引用 3 1-thread.c:(.text+0x67)...
  • Just_Finlay
  • Just_Finlay
  • 2013-08-06 17:10
  • 3592

对‘pthread_create’未定义的引用

由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数: gcc -o pthread -lpthread pthread.c ------------------- h...
  • besfanfei
  • besfanfei
  • 2012-05-07 14:43
  • 17901

make menuconfig出现一大堆未定义的错误

 kernel$ make menuconfig   HOSTLD  scripts/kconfig/mconf scripts/kconfig/mconf.o:在函数‘show_help’中: mconf.c:(.text+0x914):对‘stdscr’未定义的引...
  • liwei405499
  • liwei405499
  • 2016-12-13 11:50
  • 1495

make 对‘main’未定义的引用(多线程的可能情况)

linux C/C++ 编程时,出现如下错误提示:Building target: CTMPServer20160413 Invoking: Cross G++ Linker g++ -Lcrypto -o "C" ./lib/adns/check.o ./lib/adns/e...
  • lilil371324
  • lilil371324
  • 2016-04-14 20:46
  • 4449

Linux应用开发———编译程序提示“对“xxxxxx”未定义的引用”

使用C语言做一个简单的服务器demo程序,需要用到http,于是安装了一个libghttp。     安装完之后,在编译对应例程的时候提示:     在安装libghttp库的时候,在配置那里使用了命令:     于是...
  • fang_yang_wa
  • fang_yang_wa
  • 2017-08-12 18:04
  • 3979
    个人资料
    • 访问:186116次
    • 积分:2415
    • 等级:
    • 排名:第18095名
    • 原创:65篇
    • 转载:10篇
    • 译文:13篇
    • 评论:26条
    文章分类
    最新评论