繁体   English   中英

已定义符号的静态库链接问题“未定义符号”

[英]Static Library Linking Issue "Undefined symbols" for symbols that are defined

我正在使用 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

将评论转换为答案。

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

  • 你有没有检查过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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM