美文网首页
undefined reference to

undefined reference to

作者: ebayboy | 来源:发表于2019-04-23 18:11 被阅读0次

    今天遇到一个CMake 链接问题,这里提出来和大家分享:

    问题:

    自己用C语言写了一个动态:libword-counter.so,公开头文件word-counter.h, 其中有函数如:wc_get_word_freq()

    自己用C++语言写了一个测试工程,在main函数中调用上述库函数wc_get_word_freq。

    结果出现undefined reference to 的错误

    分析:

    1. 根据Cmake的编译log,可以看出该错误是在linking target的时候出现的,因此build是OK的

    2. 如果修改头文件为其他文件,则出现找不到文件的错误,因此说明头文件可以正常找到。也在次说明1中build是没问题的

    3. 编译选项我已经指明了需要加载的库 -lword-counter

    4. 如果修改3中的库名,则出现找不到so的错误,说明3中编译选项是没问题的,系统能找到这个库so

    5. 现在出现问题“undefined reference to 的错误”,太诡异了?

    6. 本人一直坚信,计算机不会出现灵异事件,因此不断请教度娘

    7. 发现有人建议我用nm命令查看so的符号表,看看这个函数是否正常,于是nm -D 库文件,查看了下,结果函数正常的。

    8. 最后想到C++调用C存在混编问题,有人建议编译选项加上 -lstdc++,结果还是不行

    9. 最终沿着混编问题走下去,我找到了原因,需要在库文件的头文件中加上下面的语句,用以指定,在编译C++的时候被调用的代码仍然使用C编译选项。

    #ifdef __cplusplus

    extern "C"

    {

    #endif

    问题解决,希望遇到问题的小伙伴能看到,少走弯路~~

    补充:

    今天又遇到一个类似问题,找不到函数声明,extern c没问题,最终利用步骤7,发现so中没有符号表。

    root cause:函数没有export出去

    #ifndef EXPORT_API

    #define EXPORT_API __attribute__((visibility("default")))

    #endif

    EXPORT_API

    int get_download_info()

    {

    }

    还有一种可能是-lXXX的位置以及库之间的依赖顺序:

    原来编译命令不能这样:

    gcc -lXXXX -o test test.o

    要改成:

    gcc -o test test.o -lXXXX

    这样就没错了。

    相关文章

      网友评论

          本文标题:undefined reference to

          本文链接:https://www.haomeiwen.com/subject/wusbgqtx.html