2017-09-01 68 views
1

我試圖建立下面的示例代碼在一步一步的時尚不能鏈接到C標準庫在MacOS

#include <stdio.h> 

int main(void) { 
    puts("hello, world"); 
} 

這裏是我的Makefile

CC=clang 
CFLAGS=-g 
LD=ld 
LDFLAGS=-macosx_version_min 10.12 
LDLIBS=-L/usr/lib/system/ 

a.out: main.o 
    $(LD) $(LDFLAGS) $< $(LOADLIBES) $(LDLIBS) 

main.o: main.c 
    $(CC) $(CFLAGS) $(CPPFLAGS) -c $< 

它有沒有問題創造main.o,但在連接階段拋出一個錯誤:

$ make 
ld -macosx_version_min 10.12 main.o -L/usr/lib/system/ 
Undefined symbols for architecture x86_64: 
    "_puts", referenced from: 
     _main in main.o 
ld: symbol(s) not found for inferred architecture x86_64 
make: *** [a.out] Error 1 

看來ld找不到C標準庫。我究竟做錯了什麼?


供您參考,這是clang main.c -v輸出,它執行正確鏈接:

$ clang main.c -v 
Apple LLVM version 8.1.0 (clang-802.0.42) 
Target: x86_64-apple-darwin16.7.0 
Thread model: posix 
InstalledDir: /Library/Developer/CommandLineTools/usr/bin 
"/Library/Developer/CommandLineTools/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.12.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name main.c -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu penryn -target-linker-version 278.4 -v -dwarf-column-info -debugger-tuning=lldb -resource-dir /Library/Developer/CommandLineTools/usr/bin/../lib/clang/8.1.0 -fdebug-compilation-dir /Users/sunqingyao/Projects/play-ground -ferror-limit 19 -fmessage-length 167 -stack-protector 1 -fblocks -fobjc-runtime=macosx-10.12.0 -fencode-extended-block-signature -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/x0/lrg8j6r535n4lvnfnj6lr2fr0000gn/T/main-f5cd6b.o -x c main.c 
clang -cc1 version 8.1.0 (clang-802.0.42) default target x86_64-apple-darwin16.7.0 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/local/include 
/Library/Developer/CommandLineTools/usr/bin/../lib/clang/8.1.0/include 
/Library/Developer/CommandLineTools/usr/include 
/usr/include 
/System/Library/Frameworks (framework directory) 
/Library/Frameworks (framework directory) 
End of search list. 
"/Library/Developer/CommandLineTools/usr/bin/ld" -demangle -lto_library /Library/Developer/CommandLineTools/usr/lib/libLTO.dylib -no_deduplicate -dynamic -arch x86_64 -macosx_version_min 10.12.0 -o a.out /var/folders/x0/lrg8j6r535n4lvnfnj6lr2fr0000gn/T/main-f5cd6b.o -lSystem /Library/Developer/CommandLineTools/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a 

我想最後一行復制到Makefile,只得到一個file not found錯誤:

$ make 
/Library/Developer/CommandLineTools/usr/bin/ld -macosx_version_min 10.12 main.o -demangle -lto_library /Library/Developer/CommandLineTools/usr/lib/libLTO.dylib -no_deduplicate -dynamic -arch x86_64 -macosx_version_min 10.12.0 -o a.out /var/folders/x0/lrg8j6r535n4lvnfnj6lr2fr0000gn/T/main-f5cd6b.o -lSystem /Library/Developer/CommandLineTools/usr/bin/../lib/clang/8.1.0/lib/darwin/libclang_rt.osx.a 
ld: file not found: /var/folders/x0/lrg8j6r535n4lvnfnj6lr2fr0000gn/T/main-f5cd6b.o 
make: *** [a.out] Error 1 
+3

「看來'ld'無法找到C標準庫。」但是找到C庫不是'ld' *工作*! 'ld'可以和很多語言一起使用。如果你這樣使用「raw」'ld',它就是你的工作,告訴它你需要什麼庫。或者(正如@Alnitak的回答中所提到的),如果你使用'cc'並讓它爲你調用'ld',它就是'cc'的工作。 (這是有道理的:顯然C編譯器必須知道在哪裏可以找到C庫!) –

回答

6

現在使用ld直接鏈接二進制文件是不常見的,在macOS下,您需要添加-lc強制它包含標準的C庫。

通常最好使用cc來調用鏈接器,它會安排傳遞正確的標誌。

這個Makefile工作對我來說:

CC=clang 
CFLAGS=-g -mmacosx-version-min=10.12 

main: main.o 
    $(CC) -o main $(CFLAGS) $(LDFLAGS) main.o