gcc - g++ 链接时找不到符号

标签 gcc linker g++

好的,这可能是非常基本的,但我找不到问题所在。我正在尝试将我的 C++ 程序与带有 -lyajl 的 C 共享库(以 YAJL 命名)链接起来;链接器似乎找到了它(它并没有为此提示)但是找不到我在代码中使用的符号:

$> g++ test.c -lyajl

Undefined symbols for architecture x86_64:
  "yajl_tree_parse(char const*, char*, unsigned long)", referenced from:
      _main in ccEqsAaJ.o
  "yajl_tree_get(yajl_val_s*, char const**, yajl_type)", referenced from:
      _main in ccEqsAaJ.o
  "yajl_tree_free(yajl_val_s*)", referenced from:
      _main in ccEqsAaJ.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
$>

我制作了一个极简主义的 test.c 文件来隔离行为。好吧,非常奇怪的是 gcc 似乎完全可以处理代码(顺便说一下,test.c 只是 C 代码,这里没有 C++ 功能):

$> gcc test.c -lyajl
$>

gcc 做了哪些 g++ 似乎做不到的事情?

最佳答案

会不会是libyajl.so中的符号是C链接,但是你的代码(或者你使用的头文件)没有声明extern "C"?在这种情况下,将代码编译为 C++ 将导致 name-mangled symbols。在您的目标文件中,它与库中的(C 链接,未损坏的)符号不匹配。

解决方案是在头文件中编写如下内容:

#ifdef __cplusplus
// "__cplusplus" is defined whenever it's a C++ compiler,
// not a C compiler, that is doing the compiling.
extern "C" {
#endif

// Exchange "void" with the real return type for these functions
void yajl_tree_parse(char const*, char*, unsigned long);
void yajl_tree_get(yajl_val_s*, char const**, yajl_type);
void yajl_tree_free(yajl_val_s*);

#ifdef __cplusplus
}
#endif

关于gcc - g++ 链接时找不到符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11117746/

相关文章:

c++ - 返回一个字符指针(内存泄漏)

linux - 由于对gcry- *符号的许多 undefined reference ,因此无法链接git2-rs

c++ - 错误 : expected constructor, 析构函数,或 ‘&’ token 之前的类型转换

c++ - 为什么 g++ 使我的代码以不同于写入的顺序执行,我如何禁用此 "optimization"?

c++ - 使用 DLL 函数是否有任何性能命中?

gcc - std::complex 乘法非常慢

c - 这是 gcc -O2 优化错误(与 -O1 的结果不同)吗?

c++ - 如何修复丢失的 qt 小部件库 makefile 链接?

C++/GCC - 文件范围对象的构造函数没有被调用

c++ - Unresolved external symbol 错误 (LNK2019),包含 header 后