【问题标题】:Static Library Linking Issue "Undefined symbols" for symbols that are defined已定义符号的静态库链接问题“未定义符号”
【发布时间】:2017-02-12 06:00:44
【问题描述】:

我正在使用 Apple LLVM 版本 8.0.0 (clang-800.0.42.1) 进行编译。它大约有 1200 个文件,但我以前使用过它们。我去编译它们,没有问题。然后我制作我的静态库(ar rcs libblib.a *.o),没问题。因此,当我尝试使用全新的库时,我遇到了问题。

gcc main.c  -L. -lblib
Undefined symbols for architecture x86_64:
  "_N_method", referenced from:
      _main in main-7fc584.o
ld: symbol(s) not found for architecture x86_64

但是,我知道这是已定义的。我检查该文件是否包含在内 (ar -t libblib.a | grep N_METHOD.o) 并且它在其中。检查源文件,并且有方法,与头文件中的名称完全相同。我在这里遇到什么问题?我完全不知所措,我希望我错过了一些简单的东西。

我做了nm -g N_METHOD.o 并返回:

0000000000000000 T __Z8N_methodP6stacks

【问题讨论】:

  • 这个库是用 C 还是 C++ 编写的?如果是 C++,名称将被破坏。
  • @Barmar:C 不支持 方法,奥卡姆剃刀告诉我这是 C++ ;-)
  • 是C。我只是用N_method作为占位符。
  • GCC 使用 --static 链接静态库
  • 您是否检查过N_METHOD.o 是一个 64 位目标文件(或包含 32 位和 64 位代码的胖目标文件)?如果它是 32 位目标文件,那么它对于 64 位程序没有用处。但是,这有点不太可能。您必须竭尽全力在 Mac 上创建 32 位目标文件。您是否运行nm -g N_METHOD.o 来查看目标文件中是否定义了_N_method?此外,您似乎正在链接libblib.a(指定-lblib),但您正在签入libnlib.a,这在名义上是完全不相关的。这是问题的问题还是您的检查有问题?

标签: c++ c gcc linker static-libraries


【解决方案1】:

将 cmets 转换为答案。

根据问题内容,​​我问:

  • 您是否检查过N_METHOD.o 是一个 64 位目标文件(或包含 32 位和 64 位代码的胖目标文件)?如果它是 32 位目标文件,那么它对于 64 位程序没有用处。但是,这有点不太可能。您必须竭尽全力在 Mac 上创建 32 位目标文件。

  • 您是否运行过nm -g N_METHOD.o 来查看目标文件中是否定义了_N_method

我做了nm -g N_METHOD.o 并返回:

0000000000000000 T __Z8N_methodP6stacks

不要使用 C++ 编译器编译 C 代码。或者不要尝试使用 C 编译器编译 C++ 代码。错误名称 (__Z8N_methodP6stacks) 用于 C++。也许您只需要链接g++ 而不是gcc?它们是不同的语言——这是“类型安全链接”的特性,它是 C++ 的特征,而 C 完全不知道。

第一步——编译和链接:

g++ main.c -L. -lblib

假设源代码位于 C 的 C++ 子集(或 C++ 的 C 子集)中,那么这很有可能会起作用。至少,如果代码包含N_Method(&xyz),其中xyzstacks 类型的变量,那么它就有可能调用__Z8N_methodP6stacks

以下代码:

typedef struct stacks stacks;
extern int N_method(stacks*);

extern int relay(stacks *r);

int relay(stacks *r) { return N_method(r); }

使用 C++ 编译器编译以生成 nm -g 输出:

0000000000000000 T __Z5relayP6stacks
                 U __Z8N_methodP6stacks

它还使用 C 编译器进行编译以生成 nm -g 输出:

0000000000000038 s EH_frame1
                 U _N_method
0000000000000000 T _relay

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多