-
“undefined reference to“ 问题汇总及解决方法 ------非常非常好的一篇文章
2017-06-15 21:40:02在实际编译代码的过程中,我们经常会遇到"undefined reference to"的问题,简单的可以轻易地解决,但有些却隐藏得很深,需要花费大量的时间去排查。工作中遇到了各色各样类似的问题,按照以下几前些天,发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程:
人工智能入门与进阶(链接)
在实际编译代码的过程中,我们经常会遇到
"undefined reference to"
的问题,简单的可以轻易地解决,但有些却隐藏得很深,需要花费大量的时间去排查。工作中遇到了各色各样类似的问题,按照以下几种可能出现的状况去排查,可有利于理清头绪,从而迅速解决问题。链接时缺失了相关目标文件
首先编写如下的测试代码:
// test.h #ifndef __TEST_H__ #define __TEST_H__ void test(); #endif // test.c #include <string.h> #include <stdio.h> void test() { printf("just test it\n"); } // main.c #include "test.h" int main(int argc, char **argv) { test(); return 0; }
通过以下的命令,我们将会得到两个
.o
文件。$ gcc -c test.c $ gcc –c main.c
随后,我们将
main.o
这个文件,编译成可执行文件。$ gcc -o main main.o Undefined symbols for architecture x86_64: "_test", referenced from: _main in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
编译时报错了,这是最典型的
undefined reference
错误,因为在链接时发现找不到某个函数的实现文件。如果按下面这种方式链接就正确了。$ gcc -o main main.o test.o
当然,也可以按照如下的命令编译,这样就可以一步到位。
$ gcc -o main main.c test.c
链接时缺少相关的库文件
我们把第一个示例中的
test.c
编译成静态库。$ gcc -c test.c $ ar -rc test.a test.o
接着编译可执行文件,使用如下命令:
$ gcc -o main main.c Undefined symbols for architecture x86_64: "_test", referenced from: _main in main-6ac26d.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
其根本原因也是找不到
test()
函数的实现文件,由于test()
函数的实现在test.a
这个静态库中,故在链接的时候需要在其后加入test.a
这个库,链接命令修改为如下形式即可。$ gcc -o main main.c test.a
链接的库文件中又使用了另一个库文件 (这个例子非常非常好, 我就是犯了这种错误!!!)
先更改一下第一个示例中使用到的代码,在
test()
中调用其它的函数,更改的代码如下所示。// func.h #ifndef __FUNC_H__ #define __FUNC_H__ void func(); #endif // func.c #include <stdio.h> void func() { printf("call it\n"); } // test.h #ifndef __TEST_H__ #define __TEST_H__ void test(); #endif // test.c #include <string.h> #include <stdio.h> #include "func.h" void test() { printf("just test it\n"); func(); } // main.c #include "test.h" int main(int argc, char **argv) { test(); return 0; }
我们先对
fun.c
和test.c
进行编译,生成.o
文件。$ gcc -c func.c $ gcc -c test.c
然后,将
test.c
和func.c
各自打包成为静态库文件。$ ar –rc func.a func.o $ ar –rc test.a test.o
这时将
main.c
编译为可执行程序,由于main.c
中包含了对test()
的调用,因此,应该在链接时将test.a
作为我们的库文件,链接命令如下。$ gcc -o main main.c test.a Undefined symbols for architecture x86_64: "_func", referenced from: _test in test.a(test.o) ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
就是说,链接的时候发现
test.a
调用了func()
函数,找不到对应的实现,我们还需要将test.a
所引用到的库文件也加进来才能成功链接,因此命令如下。$ gcc -o main main.c test.a func.a
同样,如果我们的库或者程序中引用了第三方库(如
pthread.a
)则在链接的时候需要给出第三方库的路径和库文件,否则就会得到undefined reference
的错误。多个库文件链接顺序问题
这种问题非常隐蔽,不仔细研究,可能会感到非常地莫名其妙。以第三个示例为测试代码,把链接库的顺序换一下,如下所示:
$ gcc -o main main.c func.a test.a test.a(test.o): In function `test': test.c:(.text+0x13): undefined reference to `func' collect2: ld returned 1 exit status
因此,在链接命令中给出所依赖的库时,需要注意库之间的依赖顺序,依赖其他库的库一定要放到被依赖库的前面,这样才能真正避免
undefined reference
的错误,完成编译链接。备注:在
MAC
上可以正常编译通过。定义与实现不一致
编写测试代码如下:
// test.h #ifndef __TEST_H__ #define __TEST_H__ void test(unsigned int c); #endif // test.c #include <string.h> #include <stdio.h> void test(int c) { printf("just test it\n"); } // main.c #include "test.h" int main(int argc, char **argv) { test(5); return 0; }
先将
test.c
编译成库文件。$ gcc -c test.c $ ar -rc test.a test.o
将
main.c
编译成可执行文件。$ gcc -o main main.c test.a ld: warning: ignoring file test.a, file was built for archive which is not the architecture being linked (x86_64): test.a Undefined symbols for architecture x86_64: "_test", referenced from: _main in main-f27cf1.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
链接出错了,原因很简单,
test()
这个函数的声明和定义不一致导致,将两者更改成一样即可通过编译。在
c++
代码中链接c
语言的库代码同示例一的代码一样,只是把
main.c
更改成了main.cpp
。编译test.c
,并打包为静态库。$ gcc -c test.c $ ar -rc test.a test.o
编译可执行文件,用如下命令:
$ g++ -o main main.cpp test.a Undefined symbols for architecture x86_64: "test()", referenced from: _main in main-7d7fde.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
原因就是
main.cpp
为c++
代码,调用了c
语言库的函数,因此链接的时候找不到,解决方法是在相关文件添加一个extern "C"
的声明即可,例如修改test.h
文件。// test.h #ifndef __TEST_H__ #define __TEST_H__ #ifdef __cplusplus extern "C" { #endif void test(); #ifdef __cplusplus } #endif #endif
-
iOS 报错 Undefined symbols for architecture x86_64:解决方法
2018-01-16 10:01:51联系人:石虎 QQ:1224614774昵称:嗡嘛呢叭咪哄 QQ群:807236138群称:iOS 技术交流学习群 ...Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_Person", referenced from: _OB...联系人:石虎 QQ:1224614774 昵称: 嗡嘛呢叭咪哄
QQ群:807236138 群称: iOS 技术交流学习群
QQ群:713799633 群称:iOS技术交流学习群-2
一、报错详情
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_Person", referenced from:
_OBJC_CLASS_$_Dog in Dog.o
objc-class-ref in ViewController.o
"_OBJC_METACLASS_$_Person", referenced from:
_OBJC_METACLASS_$_Dog in Dog.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
二、解决方法
图1:
图2:在 build Phases 下操作如下
图3:添加类文件
图4:编译成功
三、造成 bug 原因,以及如何避免
1.造成 bug 原因是其它类没有参加编译造成的,这种原因又分成二种
2.如何避免
第一种:此框一定要勾选
第二种:此框一定要勾选
注意:如果忘记勾选,就在项目中的 Build Phases 中的 Compile Sources 中添加(详细前看图4)
谢谢!!!
本账号主要分享我成长过程中的各种心得感悟,包括技术总结, iOS、Swift 和 Mac 相关技术文章、工具资源、参与技术讨论,整理开发技巧、让学习成为一种享受!
-
"undefined reference to" 问题解决方法
2019-05-30 21:01:00(.text+0x13): undefined reference to `func’ 关于undefined reference 这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助。 1. 链接时缺失了相关...最近在 Linux 下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:
(.text+0x13): undefined reference to `func’
关于undefined reference 这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助。
1. 链接时缺失了相关目标文件(.o)
测试代码如下:
然后编译。gcc -c test.c
gcc –c main.c得到两个 .o 文件,一个是 main.o,一个是 test.o ,然后我们链接 .o 得到可执行程序:
gcc -o main main.o
这时,你会发现,报错了:
main.o: In function `main’:
main.c:(.text+0x7): undefined reference to ‘test’
collect2: ld returned 1 exit status这就是最典型的 undefined reference 错误,因为在链接时发现找不到某个函数的实现文件,本例中 test.o 文件中包含了 test() 函数的实现,所以如果按下面这种方式链接就没事了。
gcc -o main main.o test.o
【扩展】:其实上面为了让大家更加清楚底层原因,我把编译链接分开了,下面这样编译也会报 undefined reference 错,其实底层原因与上面是一样的。
gcc -o main main.c //缺少test()的实现文件
需要改成如下形式才能成功,将 test() 函数的实现文件一起编译。
gcc -o main main.c test.c //ok,没问题了
2. 链接时缺少相关的库文件(.a/.so)
在此,只举个静态库的例子,假设源码如下。
先把test.c编译成静态库(.a)文件gcc -c test.c
ar -rc test.a test.o至此,我们得到了 test.a 文件。我们开始编译 main.c
gcc -c main.c
这时,则生成了 main.o 文件,然后我们再通过如下命令进行链接希望得到可执行程序。
gcc -o main main.o
你会发现,编译器报错了:
/tmp/ccCPA13l.o: In function `main’:
main.c:(.text+0x7): undefined reference to ‘test’
collect2: ld returned 1 exit status其根本原因也是找不到 test() 函数的实现文件,由于该 test() 函数的实现在 test.a 这个静态库中的,故在链接的时候需要在其后加入 test.a 这个库,链接命令修改为如下形式即可。
gcc -o main main.o ./test.a //注:./ 是给出了test.a的路径
【扩展】:同样,为了把问题说清楚,上面我们把代码的编译链接分开了,如果希望一次性生成可执行程序,则可以对 main.c 和 test.a 执行如下命令。
gcc -o main main.c ./test.a //同样,如果不加test.a也会报错
3. 链接的库文件中又使用了另一个库文件
这种问题比较隐蔽,也是我最近遇到的与网上大家讨论的不同的问题,举例说明如下,首先,还是看看测试代码。
从上图可以看出,main.c 调用了 test.c 的函数,test.c 中又调用了 fun.c 的函数。
首先,我们先对 fun.c,test.c,main.c 进行编译,生成 .o 文件。gcc -c func.c
gcc -c test.c
gcc -c main.c然后,将 test.c 和 func.c 各自打包成为静态库文件。
ar –rc func.a func.o
ar –rc test.a test.o这时,我们准备将 main.o 链接为可执行程序,由于我们的 main.c 中包含了对 test() 的调用,因此,应该在链接时将 test.a 作为我们的库文件,链接命令如下。
gcc -o main main.o test.a
这时,编译器仍然会报错,如下:
test.a(test.o): In function `test’:
test.c:(.text+0x13): undefined reference to ‘func’
collect2: ld returned 1 exit status就是说,链接的时候,发现我们的 test.a 调用了 func() 函数,找不到对应的实现。由此我们发现,原来我们还需要将 test.a 所引用到的库文件也加进来才能成功链接,因此命令如下。
gcc -o main main.o test.a func.a
ok,这样就可以成功得到最终的程序了。同样,如果我们的库或者程序中引用了第三方库(如 pthread.a )则同样在链接的时候需要给出第三方库的路径和库文件,否则就会得到 undefined reference 的错误。
4 多个库文件链接顺序问题
这种问题也非常的隐蔽,不仔细研究你可能会感到非常地莫名其妙。我们依然回到第3小节所讨论的问题中,在最后,如果我们把链接的库的顺序换一下,看看会发生什么结果?gcc -o main main.o func.a test.a
我们会得到如下报错.
test.a(test.o): In function `test’:
test.c:(.text+0x13): undefined reference to ‘func’
collect2: ld returned 1 exit status因此,我们需要注意,在链接命令中给出所依赖的库时,需要注意库之间的依赖顺序,依赖其他库的库一定要放到被依赖库的前面,这样才能真正避免 undefined reference 的错误,完成编译链接。
5. 在c++代码中链接c语言的库
如果你的库文件由c代码生成的,则在 c++ 代码中链接库中的函数时,也会碰到undefined reference 的问题。下面举例说明。首先,编写 c 语言版库文件:
编译,打包为静态库:test.agcc -c test.c
ar -rc test.a test.o至此,我们得到了 test.a 文件。下面我们开始编写 c++ 文件 main.cpp
然后编译main.cpp生成可执行程序:g++ -o main main.cpp test.a
会发现报错:
/tmp/ccJjiCoS.o: In function `main’:
main.cpp:(.text+0x7): undefined reference to ‘test()’
collect2: ld returned 1 exit status原因就是 main.cpp 为 c++ 代码,调用了 c 语言库的函数,因此链接的时候找不到,解决方法:即在 main.cpp 中,把与 c 语言库 test.a 相关的头文件包含添加一个 extern “C” 的声明即可。例如,修改后的 main.cpp 如下:
g++ -o main main.cpp test.a
再编译会发现,问题已经成功解决。
-
undefined symbol
2018-08-22 08:58:16今天调试一个程序,需要调用其他模块的函数,代码就20行左右,编译也通过了,当放到机器上跑的时候,发生了crash,主要的原因是 **.so:undefined symbol: _ZN2wf7deta*(用*代替这个symbol),开始的时候用linux...今天调试一个程序,需要调用其他模块的函数,代码就20行左右,编译也通过了,当放到机器上跑的时候,发生了crash,主要的原因是 **.so:undefined symbol: _ZN2wf7deta*(用*代替这个symbol),开始的时候用linux命令nm **.so这个so文件,也找到的这个T _ZN2wf7deta*,但是前面有个大T,查了一下,T一般:Text段的符号。子程序都是这种符号,比如文件中实现了一个函数function,则function就是这种符号,又用命令 ldd **.so查询了库的依赖,发现依赖里面确实没有调用的模块,最后在CMakeLists.txt里加入了调用的模块,之后就不crash了。虽然解决了,但是还是有点疑问:
- 为什么编译的时候没有报错
- nm是可以查询出来前面是大U _**的symbol一般是undefined symbol,可是为什么查出来的是symbol前面是大T
希望CSDN上的大神们能帮忙回答一下!多谢了
-
mac 上执行 sed 修改文件 undefined label
2020-12-19 13:37:14undefined label -
null 与null相等吗?undefined与undefined?
2018-08-07 21:57:25console.log(null == null);//true console.log(null === null);... console.log(undefined == undefined);//true console.log(undefined === undefined);//true 为什么书上说它们是不相等的?... -
js typeof undefined
2019-05-14 15:55:12一、在js中判断undefined的最好办法是 用typeof。因为直接用 变量==undefined 会出现两种情况:1变量未定义,js报错 2变量为null 同样判断他为undefined typeof 的判断类型有几种,分别为:"number"、"string"、... -
变量undefined详解
2018-07-07 20:02:561.js有六种数据类型,分别是:undefined、null、string、boolean、number、object首先来说下undefined这个数据类型,可以分为三步进行详解。第一:是什么undefined是其中一种数据类型,它只有一个值,怎么说呢,使用... -
php提示Notice: Undefined index解决方法
2019-06-28 18:57:37php提示Notice: Undefined index解决方法 php提示Notice: Undefined index问题,Undefined index:是指你的代码里存在:“变量还未定义、赋值就使用”的错误,这个...Notice: Undefined index: name in … Notice: ... -
JavaScript 打印结果时多出一个undefined/出现undefined
2019-10-04 21:08:07JavaScript 打印结果时多出一个undefined/出现undefined 1.检查是否变量未初始化. 如下图,未初始化值就拿来使用,结果会出现undefined. var newStr; 修正方法为:定义的同时给变量赋一个值,如不需要值,可以赋空值... -
undefined symbol问题的查找、定位与解决方法
2019-07-16 14:29:54XXXX:symbol lookup error:/home/....../libpdfium.so:undefined symbol:CRYPT_MD5Generate 报错分析: 这个问题表明是符号未定义的问题,而且直接定位于产品链接的第三方动态库libpdfium.so中,于是从... -
javascript 判断对象是否为undefined
2017-10-25 13:52:09如何判断对象obj是否等于undefined类型? 方法一: if (typeof (obj) == "undefined") { //等于 undefined } 方法二: if (obj === undefined) { //等于 undefined } 1.null 表示无值, 2.undefined ... -
js判断undefined类型
2018-11-09 09:00:51js判断undefined类型 if (reValue== undefined){ alert(“undefined”); } 发现判断不出来,最后查了下资料要用typeof 方法: if (typeof(reValue) == “undefined”) { alert(“undefined”); } ... -
undefined: grpc.SupportPackageIsVersion6 和 undefined: grpc.ClientConnInterface 解决办法
2020-02-20 19:45:04编译protobuf的 .pb.go文件时报错,如 undefined: grpc.SupportPackageIsVersion6 或undefined: grpc.ClientConnInterface 和这个贴子的表现一样,https://github.com/grpc/grpc-go/issues/3347 解决办法 方法1... -
Cannot convert undefined or null to object
2017-01-03 15:25:021、Object.keys()中传错了参数 2、由于undefined和null无法转成对象,所以如果它们做为Object.assign()的参数(只有一个参数),也会报错 -
undefined reference to 'floor'/undefined reference to
2016-10-16 12:15:55undefined reference to 'floor'/undefined reference to `& undefined reference to 'pow'/undefined reference to `& 今天用linux编译一个程序的时候遇到了一个小问题,如标题所示,先说解决方法 ... -
Vue 项目打包后访问报错:Uncaught TypeError: Cannot read property 'call' of undefined
2018-05-08 15:49:10但访问的时候,有的页面可以正常访问有的页面空白并且控制台报错 Uncaught TypeError: Cannot read property 'call' of undefined,查看 network 里资源都已经成功加载,如下图: 解决办法 修改 webpack.prod.... -
【爬坑记录】undefined undefined reference to *** openssl 无法链接
2019-11-13 13:52:17爬坑记录1:-undefined undefined reference to *** openssl 无法链接 /usr/lib/x86_64-linux-gnu/libcurl.so: undefined reference to `PKCS12_PBE_add@OPENSSL_1.0.0' /usr/lib/x86_64-linux-gnu/libc... -
golang run时报undefined错误
2020-05-13 17:18:59.\main.go:170:10: undefined: TestLinkTask 原因 go run: 会先进行编译操作,而在此处的编译它只会以这个main.go为准,导致引用其他文件出现找不到的情况 go build:不一样,它会自动查找引用 -
undefined: resolver.BuildOption undefined: resolver.ResolveNowOption 报错的解决办法
2020-02-20 19:24:25大致是undefined: resolver.BuildOption undefined: resolver.ResolveNowOption之类,如下图 网上搜索了一番后发现是因为最新的grpc1.27和clientV3版本不兼容的问题 解决办法 把grpc版本降低到1.26或以下便可,... -
成功解决:Uncaught TypeError: Cannot read property 'search' of undefined
2018-11-06 22:33:54Uncaught TypeError: Cannot read property 'search' of undefined 本来在JS里有search() 这个方法的,但是却一直出现了undefined这个错误,如下图 分析 原因是出在了字符串身上,没有对字符串是否为空进行判断... -
前台显示undefined
2018-01-17 14:28:28后台传过来一个集合,其中有的值为null,前台却显示undefined。调试后发现ajax自动的把为空的字段设成了undefined。//搜索参数 var param = ""; //分页查询数据 var pagers = function(currentPage,pageSize) { $.... -
Undefined attribute name (placeholder).和Undefined attribute name (autocomplete).问题
2018-05-05 20:13:32myeclipse中,在写jsp代码后出现了Undefined attribute name (placeholder).和Undefined attribute name (autocomplete).问题 百度了一下,说是头文件出了问题 原来是: 改为: 问题解决! 原因: 在 ... -
Shadows启动报错undefined symbol EVP_CIPHER_CTX_cleanup
2019-07-06 10:29:09本文主要解决openssl升级到1.1.0以上版本,导致shadows2.8.2启动报undefinedsymbol: EVP_CIPHER_CTX_cleanup错误。...AttributeError: /usr/local/ssl/lib/libcrypto.so.1.1: undefined symbol: EVP_CIPHER_CTX_cl... -
window.undefined=window.undefined
2012-08-13 15:03:43在jquery中我们见到window.undefined=window.undefined的写法,今日又在ext中见到window["undefined"]=window["undefined"],对其写法非常不理解,将自身赋给自身有什么意义,在网上狂搜一番也没有明确的解释,后来... -
js 判断 null undefined
2018-06-14 11:08:31判断 undefined typeof(variable) == "undefined" 判断undefined variable===null variable==undefined&&typeof(variable) == "object" -
解决 undefined reference to 问题
2018-06-14 15:27:40首先这篇文章总结得不错 ... 然后依然会碰到问题,这时候就要看具体的函数签名了 Name Mangling in C++ 参考 http://blog.51cto.com/hipercomer/855223 nm工具的 –demangle 选项 可以让函数名可读 ...name dema... -
TypeError: Class extends value undefined is not a constructor or null
2020-05-21 16:21:21$ vue-cli-service build ⠋ Building for production... ERROR TypeError: Class ...TypeError: Class extends value undefined is not a constructor or null at Object.<anonymous> (/root/deploy/ui/node. -
null==undefined和null!==undefined
2015-05-08 21:04:09rt,在JavaScript中 ... 对于null==undefined,规范里规定了在“==”两端的变量类型不同时的判断规则,其中有一条规则便是当两端分别为null和undefined时返回true。 而对于第二个null==undefined返回false,
-
Windows系统管理
-
粤省事移动政务服务平台 第 4 部分:建设规范.rar
-
C++代码规范和Doxygen根据注释自动生成手册
-
Scanner-Radio(jb51.net).apk
-
MaxScale 实现 MySQL 读写分离与负载均衡
-
关于易锦,web攻防渗透就业
-
(合集) MSVBCRT_AIO_2017.03.13_X86 X64
-
Javascript中文参考手册(W3C标准版) CHM
-
SSS1700B1_USB Headset Line-in Controller Datasheet_v01_20210126(1).pdf
-
Mysql数据库面试直通车
-
基于电商业务的全链路数据中台落地方案(全渠道、全环节、全流程)
-
vue3从0到1-超详细
-
MySQL 高可用工具 DRBD 实战部署详解
-
Glasterfs 分布式网络文件系统
-
uni-app手势
-
python中怎么取两个列表 集合的交集
-
Redis3.2X64 windows版
-
定时提醒软件.zip
-
基于安全意识图的半监督学习
-
在 Linux 上构建企业级 DNS 域名解析服务