G++ 未定义的引用,与自定义共享库链接时

g++ undefined reference to while linking with a custom shared library

提问人:Setu 提问时间:10/6/2022 更新时间:10/7/2022 访问量:775

问:

我正在尝试将我的 C++ 程序与自定义共享库链接。共享库是用 C 语言编写的,但是,我认为这无关紧要。我的图书馆叫做.其完整路径为 。我还添加到了我的所以应该能够找到它。当我跑步时,我得到:libfoo.so/home/xyz/customlib/libfoo.so/home/xyz/customlibLD_LIBRARY_PATHldnm -D libfoo.so

...
00000000000053a1 T myfunc
000000000000505f T foo
0000000000004ca9 T bar
00000000000051c6 T baz
000000000000527f T myfunc2
...

所以我认为我的库是正确编译的。我正在尝试通过运行test.cpp

g++ -L/home/xyz/customlib -Og -g3 -ggdb -fsanitize=address test.cpp -o test -lfoo

但是,我收到以下错误:

/usr/bin/ld: in function sharedlib_test1()
/home/xyz/test.cpp:11: undefined reference to `myfunc()'
/usr/bin/ld: in function sharedlib_test2()
/home/xyz/test.cpp:33: undefined reference to `foo()'
...

我做错了什么?我该如何解决这个问题?请注意,我已经重命名了文件和共享库,因为我无法共享确切的文件和函数名称。

C++ C 共享库 ld 未定义引用

评论

2赞 user7860670 10/6/2022
¿导入的函数是否声明为 ?extern "C"
0赞 Jesper Juhl 10/6/2022
stackoverflow.com/questions/12573816/......
1赞 Brian McFarland 10/6/2022
关于:“共享库是用 C 语言编写的,但是,我认为这无关紧要”,您通常需要确保函数在标头中声明为“extern C”。
0赞 Brian McFarland 10/6/2022
稍微扩展一下......通常,两用 C/C++ 库将使用预处理器指令,如果为 true,则使用整个标头。但是,如果您不能/不想修改 C 库标头,您也可以将 包含在 CPP 源中。如果你正在做语言混合和匹配,最好熟悉这两种方法。#ifdef __cplusplusextern "C"#includeextern "C"
0赞 Setu 10/7/2022
我错过了外部“C”。感谢您的帮助!

答:

1赞 Setu 10/7/2022 #1

正如帖子中的评论所指出的,事实证明,我在头文件中缺少外部“C”。因此,在我的代码中,我将我的 include 语句包装在一个解决了这个问题的外部“C”中。

TLDR:代码中包含的标头应如下所示:

extern "C"      // Import C style functions 
{
        #include <foo.h>
}