【发布时间】: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