精华内容
下载资源
问答
  • 在实际编译代码的过程中,我们经常会遇到"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.ctest.c进行编译,生成.o文件。

    $ gcc -c func.c  
    $ gcc -c test.c

    然后,将test.cfunc.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.cppc++代码,调用了c语言库的函数,因此链接的时候找不到,解决方法是在相关文件添加一个extern "C"的声明即可,例如修改test.h文件。

    
    // test.h
    
    #ifndef __TEST_H__
    #define __TEST_H__
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    void test();
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif

     

     

     

    展开全文
  • 联系人:石虎 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.a

    gcc -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 reference to” 问题解决方法》

    展开全文
  • 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了。虽然解决了,但是还是有点疑问:

    1. 为什么编译的时候没有报错
    2. nm是可以查询出来前面是大U _**的symbol一般是undefined symbol,可是为什么查出来的是symbol前面是大T

    希望CSDN上的大神们能帮忙回答一下!多谢了

    展开全文
  • mac 上执行 sed 修改文件 undefined label

    万次阅读 2020-12-19 13:37:14
    undefined label
  • console.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:56
    1.js有六种数据类型,分别是:undefined、null、string、boolean、number、object首先来说下undefined这个数据类型,可以分为三步进行详解。第一:是什么undefined是其中一种数据类型,它只有一个值,怎么说呢,使用...
  • php提示Notice: Undefined index解决方法

    万次阅读 2019-06-28 18:57:37
    php提示Notice: Undefined index解决方法 php提示Notice: Undefined index问题,Undefined index:是指你的代码里存在:“变量还未定义、赋值就使用”的错误,这个...Notice: Undefined index: name in … Notice: ...
  • JavaScript 打印结果时多出一个undefined/出现undefined 1.检查是否变量未初始化. 如下图,未初始化值就拿来使用,结果会出现undefined. var newStr; 修正方法为:定义的同时给变量赋一个值,如不需要值,可以赋空值...
  • undefined symbol问题的查找、定位与解决方法

    万次阅读 多人点赞 2019-07-16 14:29:54
    XXXX: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:51
    js判断undefined类型 if (reValue== undefined){ alert(“undefined”); } 发现判断不出来,最后查了下资料要用typeof 方法: if (typeof(reValue) == “undefined”) { alert(“undefined”); } ...
  • 编译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:02
    1、Object.keys()中传错了参数 2、由于undefined和null无法转成对象,所以如果它们做为Object.assign()的参数(只有一个参数),也会报错
  • undefined reference to 'floor'/undefined reference to `& undefined reference to 'pow'/undefined reference to `&   今天用linux编译一个程序的时候遇到了一个小问题,如标题所示,先说解决方法 ...
  • 但访问的时候,有的页面可以正常访问有的页面空白并且控制台报错 Uncaught TypeError: Cannot read property 'call' of undefined,查看 network 里资源都已经成功加载,如下图: 解决办法 修改 webpack.prod....
  • 爬坑记录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之类,如下图 网上搜索了一番后发现是因为最新的grpc1.27和clientV3版本不兼容的问题 解决办法 把grpc版本降低到1.26或以下便可,...
  • Uncaught 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) { $....
  • myeclipse中,在写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&amp;&amp;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...
  • $ 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:09
    rt,在JavaScript中 ... 对于null==undefined,规范里规定了在“==”两端的变量类型不同时的判断规则,其中有一条规则便是当两端分别为null和undefined时返回true。  而对于第二个null==undefined返回false,

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 178,088
精华内容 71,235
关键字:

undefined