2015-06-19 63 views
3

我試圖生成一個靜態庫並將其與執行二進制文件鏈接起來。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 

什麼可能是錯誤的?

+0

什麼是真正的錯誤是,蘋果不道德把周圍鐺/ LLVM的包裝並把它稱爲GCC,當大多數系統GCC是指GNU GCC不是蘋果的鐺/ LLVM。因爲liblto_plugin.so是一個gnu擴展,所以蘋果的編譯器不知道在哪裏可以找到它,因爲它不在系統路徑或框架中。我已經使用了ar rcs lib * .a * .o,你根本不需要使用libtool,只需鏈接到gnu gcc,使用macports或brew進行安裝。 –

+0

這兩個問題不是完全重複的,但非常相似:[在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)。 –

回答

4

該庫應該使用libtool -static生成。

gcc -c io.c 
libtool -static -o libio.a io.o 
gcc main.c -lio -o main -L. 
main 

返回

10 

ar> lipo -info libio.a 
input file libio.a is not a fat file 
Non-fat file: libio.a is architecture: x86_64 

ar> file libio.a 
libio.a: current ar archive 

ar> nm libio.a 

io.o: 
0000000000000000 T _hello 

提示從this page

+0

不,它實際上並不是。 –

0

從黑客CMake生成make文件(CMakeFiles/test.dir/link.txt),在默認情況下使用的/usr/local/ar中的ar似乎不能正常工作。

這是link.txt的內容。

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar qc libtest.a CMakeFiles/test.dir/test.c.o 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib libtest.a 

從腳本中,/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar是我必須使用的。

[email protected] ar> ls -alF /usr/bin/ar 
-rwxr-xr-x 1 root wheel 18160 Oct 17 18:49 /usr/bin/ar* 
[email protected] ar> ls -alF /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar 
-rwxr-xr-x 1 root wheel 33472 Oct 29 16:36 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar* 

同樣地,應使用ranlib的是/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib不是默認之一。

[email protected] ar> ls -alF `which ar` 
-rwxr-xr-x 1 root wheel 18160 Oct 17 18:49 /usr/bin/ar* 
[email protected] ar> ls -alF /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib 
lrwxr-xr-x 1 root wheel 7 Nov 10 21:10 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/[email protected] -> libtool 

除此之外-qc選項需要使用(從cmake的生成腳本)

-c  Whenever an archive is created, an informational message to that 
     effect is written to standard error. If the -c option is speci- 
     fied, ar creates the archive silently. 
-q  (Quickly) append the specified files to the archive. If the ar- 
     chive does not exist a new archive file is created. Much faster 
     than the -r option, when creating a large archive piece-by-piece, 
     as no checking is done to see if the files already exist in the 
     archive. 

這些是得到正確的庫文件的命令:

clang -c hellolib.cpp -o hellolib.o 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar -qc libhello.a hellolib.o 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib libhello.a 

的用法是:

clang usehello.cpp -lhello -L. 

nm和脂顯示正確的庫文件信息:

[email protected] ar> nm libhello.a 
libhello.a(hellolib.o): 
0000000000000000 T __Z3addii 
[email protected] ar> lipo -info libhello.a 
input file libhello.a is not a fat file 
Non-fat file: libhello.a is architecture: x86_64 
相關問題