mac OS X 10 10更新gcc 4 9 1後預設無法編譯連線的問題
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
MAC OS X10.10升級前使用的低版本的gcc(好像是4.7.x),正常編譯可以完成,不過會出現警告:
couldn't understand kern.osversion `14.0.0'
網友說好像是Xcode版本過低(使用的是Xcode6 beta4),現在正在升級Xcode 6.1。與此同時,使用HomeBrew升級最新的gcc 4.9.1(X86_64)。後來編譯時發現gcc老是跑到clang上去!檢查發現原來的gcc檔案被刪,在PATH中靠後的gcc在/usr/bin中被連結到clang中。遂修復gcc4.9.1的連線,然後編譯一個簡單的c原始碼,出現如下錯誤:
[email protected]: c_src$gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/4.9.1/libexec/gcc/x86_64-apple-darwin14.0.0/4.9.1/lto-wrapper
Target: x86_64-apple-darwin14.0.0
Configured with: ../configure --build=x86_64-apple-darwin14.0.0 --prefix=/usr/local/Cellar/gcc/4.9.1 --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-4.9 --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-cloog=/usr/local/opt/cloog --with-isl=/usr/local/opt/isl --with-system-zlib --enable-version-specific-runtime-libs --enable-libstdcxx-time=yes --enable-stage1-checking --enable-checking=release --enable-lto --disable-werror --with-pkgversion='Homebrew gcc 4.9.1' --with-bugurl=https://github.com/Homebrew/homebrew/issues --enable-plugin --disable-nls --enable-multilib
Thread model: posix
gcc version 4.9.1 (Homebrew gcc 4.9.1)
[email protected]: c_src$gcc -std=c11 -o x x.c
Undefined symbols for architecture x86_64:
"start", referenced from:
-u command line option
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
網上搜了一下,有人說是程式碼中某些函式名寫錯了,但我這個顯然不是這個原因。看錯誤字面意思可能是少連結了某個啟動庫導致,可以通過-v比較clang的最後命令列(因為clang不出錯),但為了圖懶省事還是罷了。於是通過搜尋找到這個連線:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54423 (順面BS某娘和某Bxxg,根本找不到,還是用某哥翻牆啊),其中和我的現象完全相同,遂加上-lcrt1.o,於是錯誤消失鳥。nm crt1.o發現其中的確有start符號:
[email protected]: c_src$nm /usr/lib/crt1.o
0000000000000170 s EH_Frame1
000000000000012a s LC1
000000000000012b s LC2
0000000000000158 s LC3
00000000000001c8 S _NXArgc
00000000000001d0 S _NXArgv
U ___dso_handle
U ___keymgr_dwarf2_register_sections
00000000000001e0 S ___progname
U __cthread_init_routine
0000000000000124 T __dyld_func_lookup
0000000000000022 T __start
U _atexit
00000000000001d8 S _environ
U _errno
U _exit
U _mach_init_routine
U _main
0000000000000110 T dyld_stub_binding_helper
0000000000000188 s func.eh
0000000000000000 T start
但是用clang正常連線無此問題,貌似也不會連線到crt1.o,不知道gcc為啥一定要連crt1.o,而為啥又預設不加上crt1.o?下面是2種編譯器的編譯後的符號表:
[email protected]: c_src$nm x_gcc x_clang
x_gcc:
0000000100001058 S _NXArgc
0000000100001060 S _NXArgv
U ___keymgr_dwarf2_register_sections
0000000100001070 S ___progname
U __cthread_init_routine
0000000100000e68 t __dyld_func_lookup
0000000100000000 A __mh_execute_header
0000000100000d66 t __start
U _atexit
0000000100001068 S _environ
U _errno
U _exit
U _mach_init_routine
0000000100000e70 S _main
U _printf
U _puts
U _sleep
0000000100000e54 t dyld_stub_binding_helper
0000000100000d44 T start
x_clang:
0000000100000000 T __mh_execute_header
0000000100000f00 T _main
U _printf
U _puts
U _sleep
U dyld_stub_binder
並且clang編譯後的大小明顯小於gcc:
-rwxr-xr-x 1 apple staff 8.4K 10 27 09:54 x_clang
-rwxr-xr-x 1 apple staff 8.6K 10 27 09:53 x_gcc
還在更新Xcode,看更新完gcc預設是否可以編譯通過哦!
更新完Xcode後gcc仍然預設不行,不知哪位可以給出解決辦法,讓其預設編譯通過?