簡體   English   中英

未定義的引用

[英]Undefined reference to

我正在嘗試使用ASIO(音頻流輸入/輸出)。 我下載了SDK,但是由於該SDK沒有庫,只有標頭和源文件,因此我不得不將其編譯為庫。 而且,它的編寫使它使用了MSVC的某些功能(特別是一些宏定義-_WIN64和WINVER)。 由於許可原因,我無法使用MSVC。 因此,我將Eclipse CDT與MinGW結合使用,告訴預處理器設置這些宏(對於Windows 7 x64)並愉快地編譯一個庫。

現在,當我想使用該庫時,我會不斷獲取未定義的引用。 你能告訴我我怎么了嗎?

Hello world文件(加載ASIO驅動程序並打印其信息):

#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的詳細輸出:

> 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
> 

編輯:

好的,現在我設法編譯了庫,因此它可以被C代碼訪問(我添加了

外部“ 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

看起來不錯。 我仍然有一些名字改寫,它仍然抱怨未定義的引用。

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

我在這里還想念什么?

編輯2:我終於使事情工作。 似乎該錯誤是由於某些剩余設置緩存造成的。 刪除項目並重新設置所有內容即可解決問題。 但是,感謝@John Zwick提供的有關庫編譯的技巧,我將為此停留很長時間。

我終於使事情工作了。 似乎該錯誤是由於某些剩余設置緩存造成的。 刪除項目並重新設置所有內容即可解決問題。 但是,感謝@John Zwick提供的有關庫編譯的技巧,我將為此停留很長時間。

ASIO是一個C庫。 您發布的nm輸出表明您已將其編譯為C ++代碼。 看看名字是如何變形的? 如果將C代碼編譯為C ++,這看起來就像您期望的那樣。 也許您不小心將ASIO代碼編譯為C ++? 如果不確定,請張貼為我們建立圖書館的成績單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM