[英]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)
,其中xyz
是stacks
类型的变量,那么它就有可能调用__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.