Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2013, 16:29   #1
andreil
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 28
По умолчанию Статическая линковка OpenAL

Собрал данную библиотеку статической через CMake. Все ОК.
Собираю проект и вижу ошибки следующего вида:
Код:
obj\Debug\sound.o||In function `ZN5SoundD2Ev':|
F:\Projects (C++)\SD\SD\sound.cpp|18|undefined reference to `_imp__alcMakeContextCurrent'|
F:\Projects (C++)\SD\SD\sound.cpp|20|undefined reference to `_imp__alcDestroyContext'|
F:\Projects (C++)\SD\SD\sound.cpp|22|undefined reference to `_imp__alcCloseDevice'|
obj\Debug\sound.o||In function `ZN5Sound13CheckALCErrorEv':|
F:\Projects (C++)\SD\SD\sound.cpp|41|undefined reference to `_imp__alcGetError'|
F:\Projects (C++)\SD\SD\sound.cpp|43|undefined reference to `_imp__alcGetString'|
obj\Debug\sound.o||In function `ZN5Sound4initEv':|
F:\Projects (C++)\SD\SD\sound.cpp|62|undefined reference to `_imp__alcOpenDevice'|
F:\Projects (C++)\SD\SD\sound.cpp|70|undefined reference to `_imp__alcCreateContext'|
F:\Projects (C++)\SD\SD\sound.cpp|75|undefined reference to `_imp__alcMakeContextCurrent'|
F:\Projects (C++)\SD\SD\sound.cpp|79|undefined reference to `_imp__alListenerfv'|
F:\Projects (C++)\SD\SD\sound.cpp|81|undefined reference to `_imp__alListenerfv'|
F:\Projects (C++)\SD\SD\sound.cpp|83|undefined reference to `_imp__alListenerfv'|
obj\Debug\sound_stream.o||In function `ZN11SoundStreamD2Ev':|
F:\Projects (C++)\SD\SD\sound_stream.cpp|15|undefined reference to `_imp__alDeleteBuffers'|
obj\Debug\sound_stream.o||In function `ZN11SoundStream12CheckALErrorEv':|
F:\Projects (C++)\SD\SD\sound_stream.cpp|22|undefined reference to `_imp__alGetError'|
F:\Projects (C++)\SD\SD\sound_stream.cpp|24|undefined reference to `_imp__alGetString'|
obj\Debug\sound_stream.o||In function `ZN11SoundStream4loadEP6Streamb':|
F:\Projects (C++)\SD\SD\sound_stream.cpp|35|undefined reference to `_imp__alGenSources'|
F:\Projects (C++)\SD\SD\sound_stream.cpp|45|undefined reference to `_imp__alSourcef'|
F:\Projects (C++)\SD\SD\sound_stream.cpp|46|undefined reference to `_imp__alSourcef'|
F:\Projects (C++)\SD\SD\sound_stream.cpp|47|undefined reference to `_imp__alSourcefv'|
F:\Projects (C++)\SD\SD\sound_stream.cpp|48|undefined reference to `_imp__alSourcefv'|
F:\Projects (C++)\SD\SD\sound_stream.cpp|50|undefined reference to `_imp__alSourcef'|
obj\Debug\sound_stream.o||In function `ZN11SoundStream8load_oggEP6Stream':|
F:\Projects (C++)\SD\SD\sound_stream.cpp|125|undefined reference to `_imp__alSourcei'|
F:\Projects (C++)\SD\SD\sound_stream.cpp|136|undefined reference to `_imp__alGetSourcei'|
F:\Projects (C++)\SD\SD\sound_stream.cpp|143|undefined reference to `_imp__alGenBuffers'|
F:\Projects (C++)\SD\SD\sound_stream.cpp|167|undefined reference to `_imp__alSourcei'|
F:\Projects (C++)\SD\SD\sound_stream.cpp|170|undefined reference to `_imp__alSourcei'|
obj\Debug\sound_stream.o||In function `ZN11SoundStream12ReadOggBlockEjj':|
F:\Projects (C++)\SD\SD\sound_stream.cpp|215|undefined reference to `_imp__alBufferData'|
F:\Projects (C++)\SD\SD\sound_stream.cpp|222|undefined reference to `_imp__alSourceQueueBuffers'|
obj\Debug\sound_stream.o||In function `ZN11SoundStream4playEv':|
F:\Projects (C++)\SD\SD\sound_stream.cpp|230|undefined reference to `_imp__alSourcePlay'|
obj\Debug\sound_stream.o||In function `ZN11SoundStream4stopEv':|
F:\Projects (C++)\SD\SD\sound_stream.cpp|235|undefined reference to `_imp__alSourceStop'|
obj\Debug\sound_stream.o||In function `ZN11SoundStream5closeEv':|
F:\Projects (C++)\SD\SD\sound_stream.cpp|240|undefined reference to `_imp__alSourceStop'|
F:\Projects (C++)\SD\SD\sound_stream.cpp|241|undefined reference to `_imp__alIsSource'|
F:\Projects (C++)\SD\SD\sound_stream.cpp|242|undefined reference to `_imp__alDeleteSources'|
||=== Build finished: 32 errors, 0 warnings (0 minutes, 0 seconds) ===|
Раньше собирал с shared-библиотекой (то есть в DLL) - все линковалось и работало. Но решил сделать статическую линковку для упрощения программы (что бы не таскать кучу библиотек выгоном).
Посмотрел файл libOpenAL32.a и вижу там объявление всех этих функций:
Код:
FIRST LINKER MEMBER
	Symbols	: 0000012A

	MbrOffs 	Name
	-------------------- 	--------------------
	000018D8  	_alDeleteAuxiliaryEffectSlots
	000018D8  	_alIsAuxiliaryEffectSlot
	000018D8  	_alAuxiliaryEffectSlotf
	000018D8  	_alAuxiliaryEffectSlotfv
	000018D8  	_alGetAuxiliaryEffectSloti
	000018D8  	_alGetAuxiliaryEffectSlotiv
	000018D8  	_alGetAuxiliaryEffectSlotf
	000018D8  	_alGetAuxiliaryEffectSlotfv
	000018D8  	_NoneCreate
	000018D8  	_InitializeEffect
и .т.д.
Всё отличие - в отсутствии "_imp_" в именах
andreil вне форума Ответить с цитированием
Старый 25.12.2013, 21:41   #2
andreil
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 28
По умолчанию

Пристава "_imp_" означает, что функция должна находиться в динамической библиотеке (ДЛЛ). Но она же в статической! Проверил содержимое MinGW/lib - все ок, необходимая либа есть, мусора для ДЛЛки не наблюдается...
andreil вне форума Ответить с цитированием
Старый 26.12.2013, 07:03   #3
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Очередной майнер очередного койна, ага-ага.
Vapaamies вне форума Ответить с цитированием
Старый 26.12.2013, 08:05   #4
andreil
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Очередной майнер очередного койна, ага-ага.
С чего бы это? Банальное воспроизведение звука в игре вообще-то...
andreil вне форума Ответить с цитированием
Старый 26.12.2013, 11:26   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Возьмите любую из проблемных функций и посмотрите как объявлена в .h файле.
Наверняка есть какой-то #define который управляет нужным режимом.
Так же посмотрите с какими define вызывается компилятор сейчас - возможно ответ сразу бросится в глаза.
waleri вне форума Ответить с цитированием
Старый 26.12.2013, 12:54   #6
andreil
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Возьмите любую из проблемных функций и посмотрите как объявлена в .h файле.
Наверняка есть какой-то #define который управляет нужным режимом.
Так же посмотрите с какими define вызывается компилятор сейчас - возможно ответ сразу бросится в глаза.
(facepalm)
Еще раз повторюсь - ошибка на уровне линковки происходит.
В ALC.h:
Код:
#ifndef ALC_API
 #if defined(AL_LIBTYPE_STATIC)
  #define ALC_API
 #elif defined(_WIN32)
  #define ALC_API __declspec(dllimport)
 #else
  #define ALC_API extern
 #endif
#endif

#if defined(_WIN32)
 #define ALC_APIENTRY __cdecl
#else
 #define ALC_APIENTRY
#endif

ALC_API void        ALC_APIENTRY alcDestroyContext(ALCcontext *context);
имена функций никак не меняются. Все эти приставки - для линкера, не более.
Библиотека скомпилирована именно как статическая, поэтому флаг "AL_LIBTYPE_STATIC" должен быть установлен (я сейчас на другой машине, проверить не могу).

Как я писал ранее, линкер пытается найти функцию "_imp__alcMakeContextCurrent", но в объектнике есть функция "_alcMakeContextCurrent". Воспользуемся гуглом:
Цитата:
The __imp__ prefix appears whenever you are linking to a dll. It does not appear when linking to statically linked libs. Most likely the code is generated to be linked agains dll import lib, but you have linked it with a static lib instead.
То есть имеется статическая библиотека с функциями, но линкер пытается найти функции для динамической библиотеки.

Так понятнее?

Последний раз редактировалось andreil; 26.12.2013 в 12:57.
andreil вне форума Ответить с цитированием
Старый 26.12.2013, 13:05   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

У вас функции компилируются с __declspec(dllimport), но раз вы такой эскперт - фейспалмите и разбирайтесь сами.
waleri вне форума Ответить с цитированием
Старый 30.12.2016, 16:18   #8
offmonreal
Пользователь
 
Регистрация: 24.01.2008
Сообщений: 21
По умолчанию

Может кому пригодится.. в al.h (9 строка) есть AL_LIBTYPE_STATIC
offmonreal вне форума Ответить с цитированием
Старый 30.12.2016, 16:28   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Она не обязательна. Новые версии спокойно собираются и работают...
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenAL - Alut static lib как ? intmain Visual C++ 0 04.02.2013 14:46
QDataStream + OGG + OpenAL FYBVFPFYBC Qt и кроссплатформенное программирование С/С++ 0 03.09.2012 00:48
qt4, win32 и статическая линковка. ASGAlex Qt и кроссплатформенное программирование С/С++ 3 09.06.2009 09:13
Линковка... GHOST_Kasper Работа с сетью в Delphi 13 21.11.2007 16:06