[問題] clang++編譯時發生錯誤

看板Linux作者 (FD)時間9年前 (2015/03/30 17:36), 編輯推噓1(1056)
留言57則, 4人參與, 最新討論串1/1
先提供linux版本為:Linux Mint 17 Qiana 小弟目前在做專題中需要用到字串轉成點陣圖印出,故參考以下網頁 https://github.com/descent/progs/tree/master/cpp11_utf8 為了能編譯,照著以下網頁步驟安裝了clang與libc++ http://www.cnblogs.com/codemood/p/3142848.html 有先編譯hello world,順利的成功了也能執行 clang++ -g -stdlib=libc++ -std=c++11 -I/usr/include/c++/v1/ -I/usr/include/c++/v1/include/ `freetype-config --cflags` -Wall -W -I. -c hello.cpp clang++ -o hello hello.o -stdlib=libc++ -std=c++11 -I/usr/include/c++/v1/ -I/usr/include/c++/v1/include/ `freetype-config --libs` 在把字串轉點陣圖的main.cpp轉.o檔時跳出兩個警告,說有兩個變數沒在程式碼裡調用到 (我認為是沒有影響) main1.cpp:76:6: warning: unused variable 'starty' [-Wunused-variable] int starty = pen_y; ^ main1.cpp:75:6: warning: unused variable 'startx' [-Wunused-variable] int startx = pen_x; //startx與 starty需定義 ... ^ 2 warnings generated. 在把.o檔轉成執行檔時跳出錯誤: xxs4129-Aspire-5750G xxs4129 # clang++ -o main1 main1.o -stdlib=libc++ -std=c++11 -I/usr/include/c++/v1/ -I/usr/include/c++/v1/include/ `freetype-config --libs` /usr/bin/ld: main1.o: undefined reference to symbol '__cxa_free_exception@@CXXABI_1.3' //usr/lib/x86_64-linux-gnu/libstdc++.so.6: error adding symbols: DSO missing from command line clang: error: linker command failed with exit code 1 (use -v to see invocation) 有去google過但還是看不懂如何解決 這是我用的 main1.cpp 跟原本的一樣只是自己為了讀懂多了蠻多註解 https://mega.co.nz/#!x4lR3Y6K!L8_Z5PmLnd_yYhewgQy1FZPsaDmU0MwqfUbffJs1wxQ 還請各位大大有空能幫忙看一下 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 124.6.19.51 ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1427708166.A.FBA.htmlx049:轉錄至看板 C_and_CPP 03/30 20:01

03/30 22:37, , 1F
編 main1.o 的時候有加 -stdlib=libc++ 嗎?
03/30 22:37, 1F

03/30 22:58, , 2F
hello 程式碼編譯要兩行似乎多此一舉
03/30 22:58, 2F

03/30 23:02, , 3F
clang++ -o main1 main.cppp ..... 不就可以了 ?
03/30 23:02, 3F

03/30 23:03, , 4F
若你沒有其他特殊多個程式碼要編譯,不需要 -c 然後分開
03/30 23:03, 4F

03/30 23:08, , 5F

03/30 23:22, , 6F
另外你的問題我比較想知道的是,你編譯一般的 c++ 程式
03/30 23:22, 6F

03/30 23:23, , 7F
能夠正常工作嗎?
03/30 23:23, 7F

03/30 23:51, , 8F
我是因為這個程式才去裝linux ,還是新手看不太懂指令編譯
03/30 23:51, 8F

03/30 23:53, , 9F
k大說的編譯一般c++程式是說用上面clang++指令編譯嗎?
03/30 23:53, 9F

03/31 00:00, , 10F
這樣說好了,原本沒有修改的版本,你可以正常編譯嗎
03/31 00:00, 10F

03/31 00:01, , 11F
是的,用 clang++ 編譯一般的 c++ code
03/31 00:01, 11F

03/31 00:08, , 12F
我試過只要有用到 -stdlib=libc++ 就會跳出一樣的錯誤
03/31 00:08, 12F

03/31 00:11, , 13F
用c++版本的hello world也會跳出錯誤
03/31 00:11, 13F

03/31 00:14, , 14F
有點好奇是為了什麼功能才裝 libc++ 的嗎?
03/31 00:14, 14F

03/31 00:18, , 15F
在 wstring2utf8.h 裡有個<codecvt> 好像只有clang libc++有
03/31 00:18, 15F

03/31 00:23, , 16F
k大的那張圖我有照著編譯,第一個原版的編譯跳出了好幾行
03/31 00:23, 16F

03/31 00:24, , 17F
未參考定義到,第二個編譯結果錯誤碼與圖上的差不多
03/31 00:24, 17F

03/31 00:26, , 18F
第3個結果跟第一個一樣跳出好幾行未參考定義到
03/31 00:26, 18F

03/31 00:27, , 19F
用 clang++ -v 看看 #include 搜尋路徑
03/31 00:27, 19F

03/31 00:27, , 20F
感覺可能他先搜到 libstdc++ 的了
03/31 00:27, 20F

03/31 00:36, , 22F
X8xX6MLk9FfmpPSeQ 這是我clang++ -v的結果
03/31 00:36, 22F

03/31 00:39, , 23F
clang++ -v 後面接本來拿來編譯的參數
03/31 00:39, 23F

03/31 00:47, , 24F
-I 那些也都要,真的有編譯東西它才會顯示搜尋路徑
03/31 00:47, 24F

03/31 00:51, , 26F
DgEMfM41obJ6bjl2A 結果很長 所以就上傳txt檔
03/31 00:51, 26F

03/31 00:52, , 27F
因為codecvt不在標準內,你該考慮boost的utf_to_utf
03/31 00:52, 27F

03/31 00:58, , 28F
如果使用boost的utf_to_utf是單純更動wstring2utf8.h檔嗎?
03/31 00:58, 28F

03/31 01:25, , 29F
剛看到 gcc 5 已經有 codecvt 了,可以嘗試看看
03/31 01:25, 29F

03/31 01:31, , 30F
http://libcxx.llvm.org/ 有說在 Linux 可能要多加參數
03/31 01:31, 30F

03/31 01:44, , 31F
看不太懂要加哪些參數
03/31 01:44, 31F

03/31 02:35, , 32F
我打了 clang++ -o main1 main1.cpp -stdlib=libc++ hellowo
03/31 02:35, 32F

03/31 02:36, , 33F
d.cpp -nodefaultlibs -lc++ -lc++abi -lm -lc -lgcc_s -lgc
03/31 02:36, 33F

03/31 02:38, , 34F
c 但出現找不到-lc++abi 上面那個helloworld.cpp多打的
03/31 02:38, 34F

03/31 02:54, , 35F
為何你要加上 -nodefaultlibs 這個參數 @@
03/31 02:54, 35F

03/31 02:56, , 36F
我看不太懂,照網頁上的參數打
03/31 02:56, 36F

03/31 02:59, , 37F
在Using libc++ in your programs的linux下有兩種
03/31 02:59, 37F

03/31 02:59, , 38F
我是參考那個的
03/31 02:59, 38F

03/31 03:08, , 39F
沒關係,一般不用,不過你後面有指定其他的 lib 就還好
03/31 03:08, 39F

03/31 03:08, , 40F
另外感覺你這程式好像搞很久了...
03/31 03:08, 40F

03/31 03:08, , 41F
我這邊測試過都是在 mac os x 環境,clang 本身沒問題
03/31 03:08, 41F

03/31 03:08, , 42F
clang 是 xcode 提供的,都可以正確編譯
03/31 03:08, 42F

03/31 03:09, , 43F
我在 FreeBSD 測試,clang 預設用 libc++ 也很正常
03/31 03:09, 43F

03/31 03:10, , 44F
boost 有替代方案,程式碼簡單改一下就好
03/31 03:10, 44F

03/31 03:10, , 45F
只是重點你系統還需要有一份 boost
03/31 03:10, 45F

03/31 03:10, , 46F
主要都卡在linux跟clang++才編譯不過去吧,main的程式碼倒是
03/31 03:10, 46F

03/31 03:11, , 47F
讀懂了
03/31 03:11, 47F

03/31 03:20, , 48F
這樣吧.. 我剛剛幫你改一下改用 boost
03/31 03:20, 48F

03/31 03:21, , 49F
http://x.co/8f16Z 這是那個 wstring2utf8.h 檔案內容
03/31 03:21, 49F

03/31 03:21, , 50F
記得你應該會用 apt-get install 裝上 boost 相關套件
03/31 03:21, 50F

03/31 03:22, , 51F
我這邊是裝上 libboost1.55-dev 就可以了
03/31 03:22, 51F

03/31 03:23, , 52F
感謝大大,小弟正在安裝boost中,想問編譯時需要怎麼下指令呢
03/31 03:23, 52F

03/31 03:27, , 53F
忘記說還要裝 libboost 這個 lib, 上面那是標頭檔案
03/31 03:27, 53F

03/31 03:31, , 54F
最後 -l 不要忘記加上像是: -lboost_thread
03/31 03:31, 54F

03/31 03:32, , 55F
結論我這邊 apt 裝上 libboost1.55-dev libboost1.55
03/31 03:32, 55F

03/31 03:33, , 56F
都懶用 mac os x or freebsd 應該也是解法 XD
03/31 03:33, 56F

03/31 05:13, , 57F
終於成功了,感謝大大,小弟在這裡linux跟clang卡好久了
03/31 05:13, 57F
文章代碼(AID): #1L6Ha6-w (Linux)