Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 25.12.2013, 16:29   #1
andreil
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 28
Репутация: 10
По умолчанию Статическая линковка 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
Репутация: 10
По умолчанию

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

skype: vapaa_mies
По умолчанию

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

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

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

Цитата:
Сообщение от 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
Адрес: Нижний Новгород
Сообщений: 5,039
Репутация: 1505
По умолчанию

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

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

icq: 216409213
По умолчанию

Она не обязательна. Новые версии спокойно собираются и работают...
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x на форуме   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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 17:06




17:34.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru