2012-02-17 98 views
3

使用crosstool腳本我在Cygwin下編譯了以下編譯器gcc-4.1.1和4.2.0 20061024(預發佈)的SPARC架構:編譯時出現`__sync_val_compare_and_swap_4'未定義引用錯誤,使用gcc 4.1.1和4.2.0作爲Sparc v8目標

$ ./sparc-unknown-linux-gnu-gcc -v 
Using built-in specs. 
Target: sparc-unknown-linux-gnu 
Configured with: /crosstool-0.43/build/sparc-unknown-linux-gnu/gcc-4.1.1-glibc-2.3.6/gcc-4.1.1/configure --target=sparc-unknown-linux-gnu --host=i686-host_pc-cygwin --prefix=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu --with-headers=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-gnu/include --with-local-prefix=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-gnu --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long 
Thread model: posix 
gcc version 4.1.1 

$ ./sparc-unknown-linux-gnu-gcc -v 
Using built-in specs. 
Target: sparc-unknown-linux-gnu 
Configured with: /crosstool-0.43/build/sparc-unknown-linux-gnu/gcc-4.2-20061024-       glibc-2.3.6/gcc-4.2-20061024/configure --target=sparc-unknown-linux-gnu --host=i       686-host_pc-cygwin --prefix=/opt/crosstool/gcc-4.2-20061024-glibc-2.3.6/sparc-un       known-linux-gnu --with-headers=/opt/crosstool/gcc-4.2-20061024-glibc-2.3.6/sparc       -unknown-linux-gnu/sparc-unknown-linux-gnu/include --with-local-prefix=/opt/cros       stool/gcc-4.2-20061024-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-g       nu --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atex       it --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long 
Thread model: posix 
gcc version 4.2.0 20061024 (prerelease) 

有必要對我說,我可以在我的程序中使用__sync_val_compare_and_swap功能相關Atomic-Builtins,它支持蒙山4.1 *版本克CC。

我嘗試編譯簡單的C代碼:

long cmpxchg(long* value, long comp_val, long new_val) 
{ 
    return __sync_val_compare_and_swap(value, comp_val, new_val); 
} 

int main() 
{ 
    return 0; 
} 

但我有以下錯誤:(在兩種編譯器):

$ ./sparc-unknown-linux-gnu-gcc test_cas.c -o test_cas 
/tmp/ccREXHsP.o: In function `cmpxchg': 
test_cas.c:(.text+0x24): undefined reference to `__sync_val_compare_and_swap_4' 
collect2: ld returned 1 exit status 

什麼問題?可能是我錯誤的編譯器?可能是Sparc體系結構(SPARC v8)不支持此功能?我試圖編譯我的另一個程序 - 一切正常(編譯和執行)。

回答

6

如上所述:http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html__sync_val_compare_and_swap在某些目標上將導致函數調用(其中直接代碼生成不可用或尚未實現)。這是發生在你的情況。假設它本身對你來說不是問題,那麼你需要鏈接定義__sync_val_compare_and_swap_4和朋友的庫,我猜的是libgcc_s(所以將-lgcc_s添加到你的鏈接線)。

+0

加入-lgcc_s:$ ./sparc-unknown-linux-gnu-gcc test_cas.c -lgcc_s -o test_cas不幫我。同樣的錯誤。但我試圖找到文本「__sync_val_compare_and_swap_4」,結果是以下文件:sparc-unknown-linux-gnu \ bits \ stdC++。h.gch \ O0g.gch,sparc-unknown-linux-gnu \ bits \ stdC++。 gch \ O2g.gch,gcc \ builtins.def,cc1.exe,cc1plus.exe等。 – 2012-02-17 13:56:10

+0

你必須把庫鏈接_after_輸出:'./sparc-unknown-linux-gnu-gcc test_cas.c -o test_cas -lgcc_s' – Coren 2012-02-17 14:53:34

+0

:(有一個相同的錯誤 – 2012-02-17 15:15:37

2

在ARMv5平臺上編譯NodeJS(基於V8引擎)時遇到了類似的問題。

基本上說,你的GCC沒有這個內置函數,或者因爲你使用的是舊版本,或者這些函數沒有在你的平臺上實現,所以「-lgcc_s」甚至可能沒有幫助。

谷歌幾個小時之後,我發現這個博客頁面(http://vincesoft.blogspot.fr/2012/04/how-to-solve-undefined-reference-to.html),該解釋的原因相當明確,給了一個解決方案:

抓住你的平臺與GCC代碼這些功能的源代碼,生成的代碼放入庫中,安裝它,然後將您的應用程序與此庫鏈接。

我沒有按照這個博客中描述的確切程序,但這個想法是一樣的,它的工作原理。

希望它有幫助。

+0

不要假設你可以發佈你如何獲得NodeJS的工作?我現在有這個確切的問題。 – pms1969 2014-08-11 07:57:57

0

在Android上,我能夠用下面的標誌 LOCAL_CFLAGS + = -O3 -fopenmp LOCAL_LDFLAGS + = -O3 -fopenmp -lgcc -latomic -lgomp

0

爲我解決這個問題,上述故障的意思「你使用的是gcc/mingw交叉編譯器,所以-march = native不起作用」(我猜)。請參閱https://stackoverflow.com/a/24213278/32453(基本上可以通過手動指定-march設置來解決此問題)。

相關問題