2012-04-17 2 views
0

(私はWindows上でです。)私はこのように見えるCプログラムで私がコンパイルしたDLL(libsox)をテストしていなぜ「定義されていない参照」とは常に言いますか?

#include <stdio.h> 
#include "sox.h" 

int main(void) { 
    char const * versionText = sox_version(); 
    printf(versionText); 
    return 0; 
} 

機能DLLで定義されています(これの何かがcdeclが含まれています)sox.hで、次のプロトタイプを持っている:

LSX_RETURN_VALID_Z LSX_RETURN_PURE 
char const * 
LSX_API 
sox_version(void); 

ここで問題です:私はgcc -lsox -o test.exe test.cでファイルを構築しようとした際、私は、次のERを取得ROR:-lsox

C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\ccSS2h2z.o:test.c:(.text+0xf): undefined reference to `sox_version' 
collect2: ld returned 1 exit status 

言葉:私はMinGWののlibフォルダ内のライブラリファイル "libsox.dll.a" を持っています。私が-lsoxnonsenseと書くと、ライブラリがないと言います。これは、示されたケースではライブラリを見つけることを意味します。それではなぜリンクを作成したくないのですか?

+0

同じコンパイラでそのライブラリをビルドしましたか?シンボル名の前に '_'が付加されることがあります。 –

+0

はい、同じコンパイラでした。オブジェクトファイルと.aファイルに_sox_versionの両方が含まれていると思います。 – rynd

答えて

2
gcc -lsox -o test.exe test.c 

あなたは最初のソースファイルを配置する必要があります:

gcc test.c -lsox -o test.exe 

リンカは未定義の参照と、それは前に見た満足の参照を見つけ、順番に入力ファイルを経由するので、それはあります。したがって、コマンドラインではlibsox.a(またはそのようなもの)が読み込まれ、未定義の参照が見つかる(存在しない)。次に、あなたのtest.cに行き、そこに未定義の参照を見つけますが、それを満たすライブラリはありません。

See this answer for more info.

+0

ありがとう、これはトリックでした!私はそれが最初に本当に奇妙であることを発見しました。なぜなら、助けが "Usage:gcc [options] file ..."と言うからです。しかし、私はあなたもライブラリファイルが入力ファイルであることを意味すると思います。したがって、 "gcc -o test.exe test.c -lsox"も動作し、gccはその使用法と矛盾しています。 – rynd

関連する問題