首页
学习
活动
专区
圈层
工具
发布

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

http://www.cnblogs.com/oloroso/p/4688426.html gcc编译时对’xxxx’未定义的引用问题 原因 解决办法 gcc 依赖顺序问题 在使用gcc编译的时候有时候会碰到这样的问题...dso.o:在函数‘dso_load(char const*, char const*)’中: dso.cpp:(.text+0x3c):对‘dlopen’未定义的引用 dso.cpp:(.text+0x4c...):对‘dlsym’未定义的引用 dso.cpp:(.text+0xb5):对‘dlerror’未定义的引用 dso.cpp:(.text+0x13e):对‘dlclose’未定义的引用 原因 出现这种情况的原因...但是在链接为可执行文件的时候就必须要具体的实现了。如果错误是未声明的引用,那就是找不到函数的原型,解决办法这里就不细致说了,通常是相关的头文件未包含。...但是看上面编译的时候是有添加-ldl选项的,那么为什么不行呢? gcc 依赖顺序问题 这个主要的原因是gcc编译的时候,各个文件依赖顺序的问题。

10.7K20

C++ 链接库顺序导致的符号未定义问题

符号未定义是链接过程中常见的问题,有时候很明显,有时候却很隐晦,比如链接库的顺序导致的符号未定义问题。...问题描述使用 gcc/g++ 编译一个项目的时候,出现了未定义的符号,符号来源于一个开源库,确认了库的位置,库中符号正常定义,库及其路径都被正确的引用了。...链接顺序gcc/g++ 在合并目标文件生成可执行文件的时候会存在库的依赖问题:在命令行中,如果定义一个符号的库出现在引用这个符合的目标文件之前,那么引用就不能被解析,链接会失败。...如果不是相互独立,那么必须对它们进行排序,使得对于每个目标文件的外部引用的符号 s,在命令行中至少有一个 s 的定义是在对 s 的引用之后。...想想,因为 gcc 对库的顺序要求和 –as-needed(因为 libGalaxyRT.so 在 mutex.o 的左边,所以 gcc 认为没有用到它,–as-needed 将其忽略),ld 忽略 libGalaxyRT.so

1.9K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    linux软件安装(一)——源码安装

    PS:make clean命令用来清除上一次编译生成的目标文件。这个步骤可有可无,但为了确保编译的成功,还是加上为好。防止由于软件中含有残留的目标文件导致编译失败。...因此拥有静态函数库的软件较为庞大。而且当系统的函数库更新时,引用该函数库的所有软件都需要重新编译才能正常使用。这是非常麻烦的!但拥有静态函数库的软件可以独立运行。 2....由于软件中包含的是函数库的路径,因此该软件无法独立运行,且函数库的路径不能发生变化,一旦变化,该软件将无法找到函数库,从而无法运行!这是动态函数库的最大缺点。...在Linux中,可以使用ldconfig命令将指定的函数库加载进内存。具体步骤如下: 1. 在/etc/ld.so.conf中设置需要加载进内存的函数库 2.....1 => /lib64/libselinux.so.1 (0x0000003edb400000) libc.so.6 => /lib64/libc.so.6 (0x0000003eda400000

    5.6K40

    Binary程序分析查看类命令

    //4B(由于整型占用了4B) //论2:经过初始化的全局变量保存在数据段中 int gg_data=1; // 论6:const修饰的全局变量保存在文本段 const int g_data...ld-linux.so(elf动态库的装载器)来实现的; 它能够显示可执行模块的dependency(所属)(所属),其原理是通过设置一系列的环境变量,如下:LD_TRACE_LOADED_OBJECTS...libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f236c95d000) libcap.so.2 => /lib64/libcap.so.2 (0x00007f236c758000...我们知道ld-linux.so模块会先于executable模块程序工作,并获得控制权,因此当上述的那些环境变量被设置时ld-linux.so选择了显示可执行模块的dependency(所属)。....1 => /lib64/libaudit.so.1 (0x00007f1b92599000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f1b92372000

    91610

    一个奇怪的链接问题

    exp’未定义的引用 collect2: error: ld returned 1 exit status 我们发现,同样的编译方法编译不过了,提示对‘exp’未定义的引用,并且抛出链接出错。...再次编译运行: gcc -lm -o expTest expTest.c /tmp/ccYT3E65.o:在函数‘main’中: expTest.c:(.text+0x20):对‘exp’未定义的引用...collect2: error: ld returned 1 exit status 为什么还是不行呢?...这个就涉及到链接器的工作原理了,在此只简单说明一下:链接过程中,需要进行符号解析,并且是按照顺序解析;如果库链接在前,就可能出现库中的符号不会被需要,链接器不会把它加到未解析的符号集合中,那么后面引用这个符号的目标文件就不能解析该引用...,导致最后链接失败。

    2.2K20

    文件丢失?损坏?兼容性问题?到底是什么导致了错误

    就是初始化失败,没有更多的信息; 用 strace来查看下系统调用(open),因为对文件的操作必定要调用open函数,这里主要验证是否存在“文件丢失”的问题。...open curl 127.0.0.1 2>&1 | grep -Evi "= \-1" | awk -F'["]' '{print $2}' | xargs -I{} basename {} ld.so.cache...由以上的结果可以看出,不会是 找不到对应文件导致的初始化失败;其实对于查找是否有动态链接库文件丢失可以用: ldd 命令,ldd命令输出的结果中会报告有哪些文件是not found的,而通过strace...libcom_err.so.2 (0x00007fbd99937000) libssh2.so.1 => /lib64/libssh2.so.1 (0x00007fbd9970d000) /lib64/ld-linux-x86....1 => /lib64/libselinux.so.1 (0x00007fbd98182000) libfreebl3.so => /lib64/libfreebl3.so (0x00007fbd97f7f000

    1.2K20

    linux下 debug 工具 strace 应用之【查找命令依赖库文件】

    strace 可以记录系统调用的次数,时间,成功和失败的次数。 strace 可以跟踪发给进程的信号。...strace 可以通过pid附加到任何正在运行的进程上 问题背景: centos下执行rpm命令时提示缺失 libplds4.so 的库文件,这导致系统命令执行失败 root@BJ-CentOS7 ~...使用 strace 命令追踪系统命令执行调用的系统文件路径(参数 -e open 用于观察目前进程正引用哪些文件) root@BJ-CentOS7 ~ # strace -e open rpm -qa...| grep ssh open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 open("/lib64/librpm.so.3", O_RDONLY|O_CLOEXEC...) = 3 open("/lib64/librpmio.so.3", O_RDONLY|O_CLOEXEC) = 3 open("/lib64/libselinux.so.1", O_RDONLY|O_CLOEXEC

    2.5K20

    程序一定要从main函数开始运行吗?

    Tips: 外部符号指的是目标文件需要引用的符号,但是定义在其它目标文件中,链接前外部符号地址都是000000之类,链接后的可执行文件就可以看见这些外部符号都是有地址的。...,在链接器扫描完所有的输入目标文件后,所有这种未定义的符号都应该能在全局符号表中找到,否则报符号未定义错误。...如何指定程序入口 在ld链接过程中使用-e参数可以指定程序入口,由于一段简短的printf函数其实都依赖了好多个链接库,我们也不太方便使用链接脚本将目标文件与所有这些依赖库进行链接,所以使用下面这段内嵌汇编的程序来打印一段字符串.../test hello 如何使用自定义链接脚本实现自定义段的功能 在ld链接过程中使用-T参数可以指定链接脚本,通过ld -verbose可以查看默认的链接脚本,原文太长,这里简单截取了一部分: $...I:该符号对另一个符号的间接引用 N:debug符号 R:该符号位于只读数据区 T:该符号位于代码段 U:该符号在当前文件未定义,定义在别的文件中 ?

    1.7K30

    Linux软件安装管理之--源码包安装

    此外,有的时候,我们会在程序当中“引用、呼叫”其他的外部子程序,或者是利用其他软件提供的“函数功能”,这个时候,我们就必须要在编译的过程中,将该函式库加进来,如此一来,编译程序就可以将所有的程序代码与函式库作一个连结...,可以通过在 configure 后加上参数对安装进行控制,你如代码:   ....注:由于源代码文件有时并非只有一个文件,所以无法直接进行编译,这个时候需要先产生目标文件,然后再连结制作成为 binary  可执行文件。...:执行程序根据更新后的库信息调用库中的函数或引用库中的数据。...// 指向ld.so.conf.d目下的所有*.conf配置文件 include ld.so.conf.d/*.conf [root@web ~]# ls /etc/ld.so.conf.d/

    4K51

    Linux命令(65)——ld命令

    -b :指定目标代码输入文件的格式 -Bstatic:只使用静态库 -Bdynamic:只使用动态库 -Bsymbolic:把引用捆绑到共享库中的全局符号 -c ,--mri-script=:为与MRI链接器兼容,ld接受由MRI命令语言编写的脚本文件 --cref:创建跨引用表 -d,-dc,-dp:即使指定了可重定位的输出文件.../写入文本和数据段 -n,--nmagic: 关闭节的页面对齐,并禁用对共享库的链接。...org>:使用指定的地址作为bss段的起始点 -t,--trace:在处理输入文件时显示它们的名称 -u ,--undefined=:强制指定符号在输出文件中作为未定义符号...warn-once:对于每个未定义的符号只发出一次警告 -warn-section-align:如果为了对齐而改动了输出段地址,则发出警告 --whole-archive:对于指定的存档文件,在存档中包含所有文件

    18.7K13

    嵌入式链接脚本(LINK SCRIPT)介绍

    符号(symbol): 每个目标文件都有符号表(SYMBOL TABLE), 包含已定义的符号(对应全局变量和static变量和定义的函数的名字)和未定义符号(未定义的函数的名字和引用但没定义的符s号)...必须是库文件, 且file文件作为一组被ld重复扫描,直到不在有新的未定义的引用出现。...:检查列出的输出section,如果发现他们之间有相互引用,则报错。对于某些系统,特别是内存较紧张的嵌入式系统,某些section是不能同时存在内存中的,所以他们之间不能相互引用。...可通过 man-S 1 ld查看ld的联机帮助, 里面也包括了对这些命令的介绍. 6. 对符号的赋值 在目标文件内定义的符号可以在链接脚本内被赋值. (注意和C语言中赋值的不同!)...可以用SORT()关键字对满足字符串模式的所有名字进行递增排序,如SORT(.text*)。

    2.8K40

    头文件是必须的吗?跟一跟编译过程~~~

    returned 1 exit status 报错说,未定义的引用func()。...上面的ld是链接器,是一个可执行程序,它的输入是一个或多个目标文件,如上面指令中的main.o。 也就是说,目标文件main.o中引用了func(),但链接器找不到它的定义。...显然,main.o中引用但未定义的func()被链接器在func.o中找到了。...即,链接器在面对一个目标文件时,如果碰到里面有未定义的引用,会在其他目标文件中查找,如果找不到,则报错“undefined reference to”。如果找到有且仅有一个,则pass。...本文只是就着这个问题,跟了下编译的过程,看看平常开发过程中遇到的编译报错“未定义的引用”、“未声明的变量”这些错误来源是哪原因是什么。

    2.8K10
    领券