web-dev-qa-db-ja.com

gcc:への未定義の参照

これをコンパイルしたいと思います。

program.c

#include <libavcodec/avcodec.h>

int main(){
    int i = avpicture_get_size(AV_PIX_FMT_RGB24,300,300);
}

これを実行する

gcc -I$HOME/ffmpeg/include program.c

エラーを与える

/tmp/ccxMLBme.o: In function `main':
program.c:(.text+0x18): undefined reference to `avpicture_get_size'
collect2: ld returned 1 exit status

ただし、avpicture_get_sizeは定義されています。なぜこうなった?

39
jamie_y

ただし、avpicture_get_sizeは定義されています。

いいえ、ヘッダー(<libavcodec/avcodec.h>)が宣言するだけです。

definitionはライブラリ自体にあります。

そのため、gccを呼び出すときにlibavcodecをリンクするリンカーオプションを追加することができます。

-lavcodec

また、ライブラリはコマンドラインで指定する必要があることに注意してくださいafterそれらを必要とするファイル:

gcc -I$HOME/ffmpeg/include program.c -lavcodec

Notこのように:

gcc -lavcodec -I$HOME/ffmpeg/include program.c

更新:

Wyzardのコメントを参照すると、完全なコマンドは次のようになります。

gcc -I$HOME/ffmpeg/include program.c -L$HOME/ffmpeg/lib -lavcodec

リンカの標準の場所に保存されていないライブラリの場合、オプション-Lは、-lオプションを使用して指定されたルックアップライブラリへの追加の検索パスを指定します。この場合はlibavcodec.x.y.zです。


Gccのリンカーオプションの詳細なリファレンスについては、 こちらをお読みください

58
alk

CとC++を混合していますか?発生する可能性のある問題の1つは、.cファイルの.hファイル内の宣言を次のように囲む必要があることです。

#if defined(__cplusplus)
  extern "C" {                 // Make sure we have C-declarations in C++ programs
#endif

そして:

#if defined(__cplusplus)
  }
#endif
5
Technophile