5

私はclangでacライブラリ(c ++プロジェクトで使用される)をコンパイルしていました。このライブラリをリンクしようとすると、リンカーエラー(具体的には、hqxInit関数に関する未定義のシンボル)が発生しました。clang ++に切り替えると、機能します。nmで確認すると、clang++は名前をさらに変更します。何が起こっているのでしょうか。また、ライブラリがMunged-for-cではなくMunged-for-C ++であることをリンカーに伝えるためのより良い方法はありますか?c++でacライブラリを構築しなければならないのはばかげているようです。

//clangで構築

$ nm libhqx.a

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

//clang++で構築

$ nm libhqx.a 

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

1 に答える 1

12

clangclang++ほとんどのシステムでは同じ実行可能ファイルです。一方は、もう一方への単なるシンボリックリンクです。

プログラムは、呼び出された名前を確認し、次のことを行います。

  • の場合clang、コードをCとしてコンパイルします
  • の場合clang++、コードをC++としてコンパイルします

C ++では、コンパイラーはCとは異なる関数の名前を生成します。これは、同じ名前(ただし異なる)パラメーターを持つ複数の関数を持つことができるためです。これは「名前マングリング」と呼ばれ、それがあなたが見ているものです。

c++filt名前を「デマングル」するために呼び出されるツールを使用できます。

例:

$ c++filt __Z7hqxInitv
hqxInit()

詳細はこちら:前者は後者のシンボルリンクであるため、clang ++がclangとは異なる動作をするのはなぜですか?

于 2012-12-14T18:44:47.307 に答える