2012-12-14 79 views
4

我正在編譯一個c庫(將被一個C++項目使用)和clang。嘗試鏈接此庫時,出現鏈接程序錯誤(特別是關於hqxInit函數的未定義符號)。當我切換到鏗鏘聲++,它的作品。使用nm進行檢查,clang ++會進一步調整名稱。發生了什麼 - 是否有更好的方式告訴鏈接器庫是爲了c而不是用於C++的?看來愚蠢必須建立與C++ C庫....建立圖書館時,clang和clang ++有什麼區別?

//內置鏗鏘

$ nm libhqx.a 

libhqx.bak(init.c.o) 
04000000 C _RGBtoYUV 
00000004 C _YUV1 
00000004 C _YUV2 
00000000 T _hqxInit 

//鏗鏘++

$ nm libhqx.a 

libhqx.a(init.o): 
00000100 S _RGBtoYUV 
04000100 S _YUV1 
04000104 S _YUV2 
00000000 T __Z7hqxInitv 

回答

8

clangclang++建立在大多數系統同一個可執行文件一個只是與另一個的象徵性聯繫。

的程序檢查,看看有什麼名字被下調用,並且:

  • clang,代碼編譯爲C
  • clang++,代碼編譯爲C++

在C++中,編譯器爲函數生成的名稱與C不同 - 這是因爲您可以使用具有相同名稱(但不同)參數的多個函數。這就是所謂的「名稱搗亂」 - 這就是你所看到的。

您可以使用名爲c++filt的工具「取消」名稱。

例子:

$ c++filt __Z7hqxInitv 
hqxInit() 

點擊此處瞭解詳情:why clang++ behaves differently from clang since the former is a symbol link of the latter?

+0

輝煌,謝謝! 「name mangling」是深入挖掘它的絕佳搜索詞。 –

+0

您可以使用'--driver-mode'命令行參數來覆蓋clang/clang ++基於可執行文件的語言autodetect行爲。例如,'clang --driver-mode = g ++'應該等同於'clang ++'。 –