1

libav ライブラリを使用して簡単なコードをコンパイルしようとしています。

// Some simple code to demonstrate
#include <libavformat/avformat.h>

int main(int argc, char *argv[]) {
    av_register_all();
    return 0;
}

私は gcc バージョン 4.2.1 の Mac を使用しています。

を使用してコードをCとしてコンパイルしようとすると

gcc -o main main.c -lavformat

その後、コードは正常にコンパイルおよびリンクされます。ただし、使用してC++としてコンパイルしようとすると

g++ -o main main.cpp -lavformat

それは私に未定義のシンボルエラーを与えます:

Undefined symbols for architecture x86_64:
  "av_register_all()", referenced from:
      _main in ccQ23HMe.o

オプションを指定して実行すると、-v実行されるリンク手順は次のとおりです。

// gcc
"/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.8.0 -o c
 /var/folders/r0/n22t1hyn7ts92jxgd9_pn8yw0000gn/T/main-uUfZkM.o -lavformat
-lSystem /usr/bin/../lib/clang/4.1/lib/darwin/libclang_rt.osx.a

// g++
"/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.8.0 -o c
 /var/folders/r0/n22t1hyn7ts92jxgd9_pn8yw0000gn/T/main-5QU6fj.o -lavformat
 -lstdc++ -lSystem /usr/bin/../lib/clang/4.1/lib/darwin/libclang_rt.osx.a

ここでの唯一の違いは-lstdc++、リンクへの追加です。

これらの未定義シンボル エラーが表示されるのはなぜですか? リンクにライブラリを追加するだけでこれらの未定義シンボルが発生する理由はありますか? または、この問題を引き起こしている何か他のものがありますか? おそらく libavformat に特に関連していますか?

4

1 に答える 1

4

libavの「よくある質問」リストは、まさにこのシナリオをカバーしています!

ここでの唯一の違いは、リンクへの -lstdc++ の追加です。

いいえ、それは、異なるデフォルトの呼び出し規約を持つ別の言語を使用していることです。

av_register_allヘッダーで宣言されているものはマークされていませんがextern "C"、実際にコンパイルされたライブラリの定義には、古き良き C 呼び出し規約が必要です。

libavインクルードを で囲みますextern "C"

于 2012-11-19T22:20:53.693 に答える