#c #linker #asio
#c #компоновщик #asio
Вопрос:
Я пытаюсь использовать 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(amp;driverInfo);
printf("ASIO version: %ldn", driverInfo.asioVersion);
printf("Driver name: %sn", driverInfo.name);
printf("Driver version: %ldn", driverInfo.driverVersion);
printf("Error message: %sn", driverInfo.errorMessage);
return (EXIT_SUCCESS);
}
Подробный вывод из gcc:
> gcc -v -Lc:/ASIOSDK2/lib/Win7/libasio.a -o ASIOHello.exe srcmain.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 srcmain.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 srcmain.o: In function
> `main': <my workspace path>ASIOHelloDebug/../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 srcmain.o
Чего мне здесь все еще не хватает?
ПРАВКА 2: я, наконец, заставил все работать. Похоже, ошибка была вызвана кэшированием некоторых оставшихся настроек. Удаление проекта и повторная настройка всего решили проблему. Но спасибо @John Zwick за совет по компиляции библиотеки, я бы застрял на этом надолго.
Комментарии:
1. Попробуйте заменить
-Lc:/ASIOSDK2/lib/Win7/libasio.a
наc:/ASIOSDK2/lib/Win7/libasio.a
или-lasio
.2. или
-Lc:/ASIOSDK2/lib/Win7 -lasio
Ответ №1:
Я, наконец, заставил все работать. Похоже, ошибка была вызвана кэшированием некоторых оставшихся настроек. Удаление проекта и повторная настройка всего решили проблему. Но спасибо @John Zwick за совет по компиляции библиотеки, я бы застрял на этом надолго.
Ответ №2:
ASIO — это библиотека языка Си. nm
Опубликованный вами вывод предполагает, что вы скомпилировали его как код на C . Видите, как искажены имена? Это выглядит так, как вы ожидали бы, если бы вы скомпилировали код C как C . Возможно, вы случайно скомпилировали ASIO-код как C ? Если вы не уверены, опубликуйте расшифровку создания библиотеки для нас.
Комментарии:
1. Я не уверен, что ASIO является библиотекой C. Я не загрузил SDK, и все файлы в значительной степени .cpp. Но их заголовки обычные .h и они выглядят как заголовки C (никаких навороченных C штучек). При компиляции библиотеки использовался g : g -O0 -g3 -Wall -c -fmessage-length=0 -D_WIN64 -DWINVER=0x0601 -o srcasio.o .. srcasio.cpp Как мне сделать, чтобы библиотеку можно было использовать в проектах на C?