我試圖生成一個靜態庫並將其與執行二進制文件鏈接起來。Mac OS X的靜態庫鏈接問題:找不到x86_64體系結構的符號
這是一個庫函數:
#include <stdio.h>
int hello() {
return 10;
}
通過這些命令,我可以得到一個靜態庫。
gcc -c io.c
ar -crv libio.a io.o
隨着lip -info
,我檢查是x86_64
架構。
ar> lipo -info libio.a
input file libio.a is not a fat file
Non-fat file: libio.a is architecture: x86_64
這是使用庫的主要功能。
#include <stdio.h>
extern int hello();
int main(int argc, char *argv[]) {
printf("%d", hello());
}
但是,當我鏈接對象與靜態庫,我有錯誤。
gcc main.c -lio -o main -L.
錯誤消息:
ld: warning: ignoring file ./libio.a, file was built for archive which is not the architecture being linked (x86_64): ./libio.a
Undefined symbols for architecture x86_64:
"_hello", referenced from:
_main in main-2c41a0.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我使用ar
爲/bin/ar
,和Mac OS X是10.10.2鏗鏘-602.0.53。
ar> clang -v
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.3.0
Thread model: posix
什麼可能是錯誤的?
什麼是真正的錯誤是,蘋果不道德把周圍鐺/ LLVM的包裝並把它稱爲GCC,當大多數系統GCC是指GNU GCC不是蘋果的鐺/ LLVM。因爲liblto_plugin.so是一個gnu擴展,所以蘋果的編譯器不知道在哪裏可以找到它,因爲它不在系統路徑或框架中。我已經使用了ar rcs lib * .a * .o,你根本不需要使用libtool,只需鏈接到gnu gcc,使用macports或brew進行安裝。 –
這兩個問題不是完全重複的,但非常相似:[在Mac上沒有正確添加到檔案中的對象文件](https://stackoverflow.com/questions/34595766/object-files-not-properly-added-to- Mac OS X上的靜態鏈接時找不到符號)(https://stackoverflow.com/questions/44343859/symbol-not-found-when-static-linking-on- MacOSX的/ 44355323#44355323)。 –