2012年4月22日 星期日

使用C++0x,clang v.s. g++,以及eclipse。

為了一個#include <array>,踏上開啟C++11神祕門扉的旅程(暈)
我的目的是用CppUTest的同時用到C++0x的功能。

OS: Mac OS X 10.6.8 Snow Leopard
gcc: 4.7
clang: 3.1
eclipse: Helios (for C++)


C++11,或C++0x,的功能可分成兩部分:語言本身和library。

語言特性由編譯器提供,若要用c++0x,在clang必須給參數-std=c++0x。
而g++除了std=c++0x也接受-std=gun++0x。

(網路上有文章說,必須定義前處理器符號__GXX_EXPERIMENTAL_CXX0X__,不過我實驗過g++4.7並不需要這個參數,在終端機或eclipse都是。)

library則不一定。clang需要另外下載libc++自行編譯,並且除了-std=c++0x還要加上-stdlib=libc++。當然,-I...libcxx/lib和-L...libcxx/include的路徑都要明確給出。
g++4.7則在port安裝完成時已經包含library,只要指定-std=c++0x即可,沒有-stdlib選項。
但需要明確指定header位置。以我的機器為例,在/opt/local/include/gcc47/c++。


以下為實驗結果:
clang在終端機卡在這一步:


clang++-mp-3.1 Die.cpp DieTest.cpp RunAllTest.cpp -std=c++0x -stdlib=libc++ -I/Users/mac/learncpp/CppUTest/include -L//Users/mac/learncpp/CppUTest/lib -lCppUTest
Undefined symbols:
  "__ZNKSs5c_strEv", referenced from:
      __Z10StringFromRKSs in libCppUTest.a(SimpleString.o)
ld: symbol(s) not found
clang: error: linker command failed with exit code 1 (use -v to see invocation)

libc++的lib和inlcude路徑都在/usr/lib和/usr/include下設置soft link,應該是找得到。不知為何卡在這一步...

clang在eclipse也卡住,訊息如下:


**** Build of configuration Debug for project Dice ****

**** Internal Builder is used for build               ****
clang++-mp-3.1 -I/Users/mac/learncpp/CppUTest/include -I/Users/mac/lib/libcxx/include -O0 -emit-llvm -g3 -Wall -c -fmessage-length=0 -std=c++0x -stdlib=libc++ -oRunAllTest.bc ../RunAllTest.cpp
clang++-mp-3.1 -I/Users/mac/learncpp/CppUTest/include -I/Users/mac/lib/libcxx/include -O0 -emit-llvm -g3 -Wall -c -fmessage-length=0 -std=c++0x -stdlib=libc++ -oDie.bc ../Die.cpp
clang++-mp-3.1 -I/Users/mac/learncpp/CppUTest/include -I/Users/mac/lib/libcxx/include -O0 -emit-llvm -g3 -Wall -c -fmessage-length=0 -std=c++0x -stdlib=libc++ -oDieTest.bc ../DieTest.cpp
llvm-ld -v -L/usr/lib -L/Users/mac/learncpp/CppUTest/lib -native -o Dice RunAllTest.bc DieTest.bc Die.bc -lCppUTest
  Linking bitcode file 'RunAllTest.bc'
  Linked in file 'RunAllTest.bc'
  Linking bitcode file 'DieTest.bc'
  Linked in file 'DieTest.bc'
  Linking bitcode file 'Die.bc'
  Linked in file 'Die.bc'
  Linking archive file '/Users/mac/learncpp/CppUTest/lib/libCppUTest.a'
Generating Bitcode To Dice.bc
Generating Assembly With: 
'/opt/local/libexec/llvm-3.1/bin/llc' '-x86-asm-syntax=att' '-o' 'Dice.s' 'Dice.bc' 
Generating Native Executable With:
'/usr/bin/gcc' '-fno-strict-aliasing' '-O3' '-o' 'Dice' 'Dice.s' '-L/usr/lib' '-L/Users/mac/learncpp/CppUTest/lib' '-lCppUTest' 
Dice.s:32:Unknown pseudo-op: .cfi_startproc
Dice.s:39:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:39:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:45:Unknown pseudo-op: .cfi_endproc
Dice.s:49:Unknown pseudo-op: .cfi_startproc
Dice.s:56:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:56:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:64:Unknown pseudo-op: .cfi_endproc
Dice.s:68:Unknown pseudo-op: .cfi_startproc
Dice.s:75:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:75:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:78:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:78:Rest of line ignored. 1st junk character valued 50 (2).
Dice.s:81:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:81:Rest of line ignored. 1st junk character valued 51 (3).
Dice.s:83:Unknown pseudo-op: .cfi_offset
Dice.s:83:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:85:Unknown pseudo-op: .cfi_offset
Dice.s:85:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:112:Unknown pseudo-op: .cfi_endproc
Dice.s:116:Unknown pseudo-op: .cfi_startproc
Dice.s:123:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:123:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:131:Unknown pseudo-op: .cfi_endproc
Dice.s:135:Unknown pseudo-op: .cfi_startproc
Dice.s:141:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:141:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:144:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:144:Rest of line ignored. 1st junk character valued 50 (2).
Dice.s:147:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:147:Rest of line ignored. 1st junk character valued 51 (3).
Dice.s:150:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:150:Rest of line ignored. 1st junk character valued 52 (4).
Dice.s:153:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:153:Rest of line ignored. 1st junk character valued 52 (4).
Dice.s:155:Unknown pseudo-op: .cfi_offset
Dice.s:155:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:157:Unknown pseudo-op: .cfi_offset
Dice.s:157:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:159:Unknown pseudo-op: .cfi_offset
Dice.s:159:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:161:Unknown pseudo-op: .cfi_offset
Dice.s:161:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:163:Unknown pseudo-op: .cfi_offset
Dice.s:163:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:211:Unknown pseudo-op: .cfi_endproc
Dice.s:215:Unknown pseudo-op: .cfi_startproc
Dice.s:222:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:222:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:230:Unknown pseudo-op: .cfi_endproc
Dice.s:234:Unknown pseudo-op: .cfi_startproc
Dice.s:240:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:240:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:243:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:243:Rest of line ignored. 1st junk character valued 50 (2).
Dice.s:246:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:246:Rest of line ignored. 1st junk character valued 51 (3).
Dice.s:249:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:249:Rest of line ignored. 1st junk character valued 52 (4).
Dice.s:252:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:252:Rest of line ignored. 1st junk character valued 52 (4).
Dice.s:255:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:255:Rest of line ignored. 1st junk character valued 53 (5).
Dice.s:258:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:258:Rest of line ignored. 1st junk character valued 57 (9).
Dice.s:260:Unknown pseudo-op: .cfi_offset
Dice.s:260:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:262:Unknown pseudo-op: .cfi_offset
Dice.s:262:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:264:Unknown pseudo-op: .cfi_offset
Dice.s:264:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:266:Unknown pseudo-op: .cfi_offset
Dice.s:266:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:268:Unknown pseudo-op: .cfi_offset
Dice.s:268:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:270:Unknown pseudo-op: .cfi_offset
Dice.s:270:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:362:Unknown pseudo-op: .cfi_endproc
Dice.s:366:Unknown pseudo-op: .cfi_startproc
Dice.s:372:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:372:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:374:Unknown pseudo-op: .cfi_offset
Dice.s:374:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:387:Unknown pseudo-op: .cfi_endproc
Dice.s:391:Unknown pseudo-op: .cfi_startproc
Dice.s:397:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:397:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:399:Unknown pseudo-op: .cfi_offset
Dice.s:399:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:412:Unknown pseudo-op: .cfi_endproc
Dice.s:416:Unknown pseudo-op: .cfi_startproc
Dice.s:422:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:422:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:424:Unknown pseudo-op: .cfi_offset
Dice.s:424:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:437:Unknown pseudo-op: .cfi_endproc
Dice.s:442:Unknown pseudo-op: .cfi_startproc
Dice.s:447:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:447:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:450:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:450:Rest of line ignored. 1st junk character valued 50 (2).
Dice.s:453:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:453:Rest of line ignored. 1st junk character valued 51 (3).
Dice.s:456:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:456:Rest of line ignored. 1st junk character valued 52 (4).
Dice.s:459:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:459:Rest of line ignored. 1st junk character valued 52 (4).
Dice.s:462:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:462:Rest of line ignored. 1st junk character valued 53 (5).
Dice.s:465:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:465:Rest of line ignored. 1st junk character valued 54 (6).
Dice.s:467:Unknown pseudo-op: .cfi_offset
Dice.s:467:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:469:Unknown pseudo-op: .cfi_offset
Dice.s:469:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:471:Unknown pseudo-op: .cfi_offset
Dice.s:471:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:473:Unknown pseudo-op: .cfi_offset
Dice.s:473:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:475:Unknown pseudo-op: .cfi_offset
Dice.s:475:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:477:Unknown pseudo-op: .cfi_offset
Dice.s:477:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:582:Unknown pseudo-op: .cfi_endproc
llvm-ld: 
Build error occurred, build is stopped
Time consumed: 1622  ms.  



總之目前還沒用clang++成功過(攤手)
而g++4.2太舊不支援C++0x,要先用port安裝gcc47。

終端機下OK。
g++-mp-4.7 -std=c++0x Die.cpp DieTest.cpp RunAllTest.cpp -I/Users/mac/learncpp/CppUTest/include -L/Users/mac/learncpp/CppUTest/lib -lCppUTest

eclipse下也OK,不過必須做一些設定:
一、Project->Properties->C/C++ build->Settings->GCC C++ compiler,command那一欄原本填g++,改成g++-mp-4.7。
雖然我已經為g++-mp-4.7設soft link,但對eclipse無效,我猜想eclipse可能是用which {command}來選指令的。總之,在這裡要明確給出哪個版本的g++。
(20120604補充:Project->Properties->C/C++ build->Settings->MacOS X C++ linker 也要改成g++-mp-4.7。今天在把compiler改成4.7後遇到拋出的exception無法catch的怪問題,linker也改用4.7後解決。)
二、Project->Properties->C/C++ build->Settings->GCC C++ compiler->Miscellaneous,Other flags加上-std=c++0x。
三、這步是可選的。Project->Properties->C/C++ build->Settings->GCC C++ compiler->includes,
加入一條/opt/local/include/gcc47/c++。我發現即使不加編譯也會成功,但eclipse在include C++11特有的hearder旁會顯示問號。為了讓eclipse幫我們做更多事,還是加上去吧!


沒有留言:

張貼留言