2011-11-12 38 views
1

ASIO(オーディオストリーム入力/出力)を使用しようとしています。私はSDKをダウンロードしましたが、このSDKにはライブラリがなく、ヘッダーとソースファイルしかないので、ライブラリにコンパイルする必要がありました。さらに、MSVCのいくつかの機能(特に、いくつかのマクロ定義--WIN64とWINVER)を使用するように記述されています。私はライセンス理由のためにMSVCを使用することはできません。だから私はMinGWでEclipse CDTを使い、プリプロセッサにこれらのマクロ(Windows 7 x64用)を設定し、ライブラリをうれしくコンパイルするように伝えました。未定義の参照

今、私はそのライブラリを使いたいとき、私は未定義の参照を取得し続けます。私が間違っていることを教えてもらえますか?

こんにちは、世界ファイル(ASIOドライバをロードし、その情報を印刷する):GCCから

#include <stdio.h> 
#include <stdlib.h> 
#include <asio.h> 

int main(int argc, char **argv) { 
    ASIODriverInfo driverInfo; 
    ASIOInit(&driverInfo); 

    printf("ASIO version: %ld\n", driverInfo.asioVersion); 
    printf("Driver name: %s\n", driverInfo.name); 
    printf("Driver version: %ld\n", driverInfo.driverVersion); 
    printf("Error message: %s\n", driverInfo.errorMessage); 

    return (EXIT_SUCCESS); 
} 

冗長な出力:

ライブラリー(のみ関連オブジェクト)のための
> gcc -v -Lc:/ASIOSDK2/lib/Win7/libasio.a -o ASIOHello.exe src\main.o 
> Using built-in specs. COLLECT_GCC=gcc 
> COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.6.1/lto-wrapper.exe Target: mingw32 Configured with: ../gcc-4.6.1/configure 
> --enable-languages=c,c++,fortran,objc,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --build=mingw32 --prefix=/mingw Thread model: win32 gcc version 4.6.1 (GCC) 
> COMPILER_PATH=c:/mingw/bin/../libexec/gcc/mingw32/4.6.1/;c:/mingw/bin/../libexec/gcc/;c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../mingw32/bin/ 
> LIBRARY_PATH=c:/mingw/bin/../lib/gcc/mingw32/4.6.1/;c:/mingw/bin/../lib/gcc/;c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../mingw32/lib/;c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../;/mingw/lib/ 
> COLLECT_GCC_OPTIONS='-v' '-Lc:/ASIOSDK2/lib/Win7/libasio.a' '-o' 
> 'ASIOHello.exe' '-mtune=i386' '-march=i386' 
> c:/mingw/bin/../libexec/gcc/mingw32/4.6.1/collect2.exe -Bdynamic -o 
> ASIOHello.exe c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../crt2.o 
> c:/mingw/bin/../lib/gcc/mingw32/4.6.1/crtbegin.o 
> -Lc:/ASIOSDK2/lib/Win7/libasio.a -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1 -Lc:/mingw/bin/../lib/gcc -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../mingw32/lib -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../.. -L/mingw/lib src\main.o -lmingw32 -lgcc_eh -lgcc -lmoldname -lmingwex -lmsvcrt 
> -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_eh -lgcc -lmoldname -lmingwex -lmsvcrt c:/mingw/bin/../lib/gcc/mingw32/4.6.1/crtend.o src\main.o: In function 
> `main': <my workspace path>\ASIOHello\Debug/../src/main.c:7: undefined 
> reference to `ASIOInit' collect2: ld returned 1 exit status Build 
> error occurred, build is stopped Time consumed: 454 ms. 

とNMからの出力:

> asio.o: 
> 00000000 b .bss 
> 00000000 d .data 
> 00000000 N .debug_abbrev 
> 00000000 N .debug_aranges 
> 00000000 N .debug_info 
> 00000000 N .debug_line 
> 00000000 N .debug_loc 
> 00000000 N .debug_str 
> 00000000 r .eh_frame 
> 00000000 r .rdata 
> 00000000 t .text 
> 0000055a T __Z10ASIOFuturelPv 
> 0000018c T __Z15ASIOGetChannelsPlS_ 
> 00000596 T __Z15ASIOOutputReadyv 
> 0000052c T __Z16ASIOControlPanelv 
> 000001db T __Z16ASIOGetLatenciesPlS_ 
> 0000029b T __Z17ASIOCanSampleRated 
> 0000047b T __Z17ASIOCreateBuffersP14ASIOBufferInfollP13ASIOCallbacks 
> 0000022a T __Z17ASIOGetBufferSizePlS_S_S_ 
> 000002e9 T __Z17ASIOGetSampleRatePd 
> 0000031e T __Z17ASIOSetSampleRated 
> 000004fe T __Z18ASIODisposeBuffersv 
> 00000422 T __Z18ASIOGetChannelInfoP15ASIOChannelInfo 
> 000003b1 T __Z18ASIOSetClockSourcel 
> 0000036c T __Z19ASIOGetClockSourcesP15ASIOClockSourcePl 
> 000003e6 T __Z21ASIOGetSamplePositionP11ASIOSamplesP13ASIOTimeStamp 
> 00000103 T __Z8ASIOExitv 
> 00000000 T __Z8ASIOInitP14ASIODriverInfo 
> 0000015e T __Z8ASIOStopv 
> 00000130 T __Z9ASIOStartv 
>   U __ZN11AsioDrivers19removeCurrentDriverEv 
>   U _asioDrivers 
> 00000000 B _theAsioDriver 
> 

EDIT:

オーケーは、今私はそれがCコードによってづけしているので、ライブラリをコンパイルするために管理(私はすべての関数宣言の前に

にextern「C」

を追加しました。 nm出力は次のようになります。

> 0000036c T _ASIOGetClockSources 
> 000001db T _ASIOGetLatencies 
> 000003e6 T _ASIOGetSamplePosition 
> 000002e9 T _ASIOGetSampleRate 
> 00000000 T _ASIOInit 
> 00000596 T _ASIOOutputReady 
> 000003b1 T _ASIOSetClockSource 
> 0000031e T _ASIOSetSampleRate 
> 00000130 T _ASIOStart 
> 0000015e T _ASIOStop 

これはかなり良いです。私はまだいくつかの名前をmangling thoを持って、それはまだ未定義の参照について不平を言う。

gcc -v -Lc:/ASIOSDK2/lib/Win7 -lasio -o ASIOHello.exe src\main.o 

ここではまだ何が欠けていますか?

EDIT 2: 私はついに仕事を作った。エラーは、キャッシングの残りの設定によって引き起こされたようです。プロジェクトを削除してすべての設定をやり直して、問題を解決しました。しかし、ライブラリコンパイルのヒントの@John Zwickに感謝します。私は長い間それに固執しています。

+0

'-Lc:/ ASIOSDK2/lib/Win7/libasio.a'を' c:/ ASIOSDK2/lib/Win7/libasio.a'または '-lasio'に置き換えてみてください。 –

+0

または '-Lc:/ ASIOSDK2/lib/Win7 -lasio' – Mat

答えて

1

私はついに仕事を作った。エラーは、キャッシングの残りの設定によって引き起こされたようです。プロジェクトを削除してすべての設定をやり直して、問題を解決しました。しかし、ライブラリコンパイルのヒントの@John Zwickに感謝します。私は長い間それに固執しています。

0

ASIOはCライブラリです。あなたが投稿したnmの出力は、あなたがC++コードとしてコンパイルしたことを示唆しています。名前がどのように変更されているかを確認しますか? CコードをC++としてコンパイルした場合、それはあなたが期待するように見えます。 ASIOコードを誤ってC++としてコンパイルしたのでしょうか?あなたがわからない場合は、私たちのために図書館を建てるための写しを投稿してください。

+0

ASIOがCライブラリであるかどうかはわかりません。私はSDKをdonwloadedし、すべてのファイルはかなり多くの.cppです。しかし、彼らのヘッダーは普通の.hなので、Cヘッダーのように見えます(C++のものはありません)。 ライブラリーコンパイルg ++: g ++ -O0 -g3 -Wall -c -fmessage-length = 0 -D_WIN64 -DWINVER = 0x0601 -o src \ asio.o .. \ src \ asio.cpp これを行うにはライブラリはCプロジェクトで使用できますか? –