Неразрешенные внешние символы при сборке SDL2_mixer с помощью Visual C++

Я пытаюсь собрать SDL2_mixer (2.0.2) с помощью Microsoft Visual C++ в Visual Studio, похоже, я правильно его настроил.

Но кажется, что два примера проектов playmus и playwave возвращают ошибки (всего 17 для каждого) относительно неразрешенных внешних символов относительно FLAC( Бесплатные Lossless Aаудио Codec) и modplug.

Кажется, я правильно связал их, добавив modplug.lib и libFLAC_static.lib в столбец дополнительных зависимостей компоновщика для обоих примеров проектов.

Я пытался решить эту проблему, потому что очевидно, что если эти два примера проектов потерпят неудачу, то мой проект, использующий SDL2_mixer, также потерпит неудачу с этими неразрешенными ошибками внешних символов.

И, в конце концов, я был прав. Это случилось... когда я его использовал.

Итак, изящно, есть ли способ избавиться от этих ошибок компоновщика (кажется, что я связал их правильно).

Ошибки здесь (если позволите):

Ошибка LNK2019: ссылка на неразрешенный внешний символ __imp__ModPlug_Load в функции _MODPUG_Load

Ошибка LNK2019: ссылка на неразрешенный внешний символ __imp__FLAC__stream_decoder_process_until_end_of_stream в функции _FLAC_Load

Ошибка LNK2019: неразрешенный внешний символ __imp__FLAC__stream_decoder_process_until_end_of_metadata, на который ссылается функция _FLAC_Load

Ошибка LNK2019: ссылка на неразрешенный внешний символ __imp__FLAC__stream_decoder_process_single в функции _FLAC_Load

Ошибка LNK2019: ссылка на неразрешенный внешний символ __imp__FLAC__stream_decoder_flush в функции _FLAC_Load

Ошибка LNK2019: ссылка на неразрешенный внешний символ __imp__FLAC__stream_decoder_finish в функции _FLAC_Load

Ошибка LNK2019: ссылка на неразрешенный внешний символ __imp__FLAC__stream_decoder_init_stream в функции _FLAC_Load

Ошибка LNK2019: ссылка на неразрешенный внешний символ __imp__FLAC__stream_decoder_get_state в функции _FLAC_Load Ошибка LNK2019: ссылка на неразрешенный внешний символ __imp__FLAC__stream_decoder_delete в функции _FLAC_Load

Ошибка LNK2019: ссылка на неразрешенный внешний символ __imp__FLAC__stream_decoder_new в функции _FLAC_Load

Ошибка LNK2019: ссылка на неразрешенный внешний символ __imp__ModPlug_SetMasterVolume в функции _MODPLUG_Load

Ошибка LNK2019: неразрешенный внешний символ __imp__ModPlug_SetSettings, указанный в функции _MODPLUG_Load

Ошибка LNK2019: ссылка на неразрешенный внешний символ __imp__ModPlug_GetSettings в функции _MODPLUG_Load

Ошибка LNK2019: ссылка на неразрешенный внешний символ __imp__ModPlug_Seek в функции _MODPUG_Load

Ошибка LNK2019: ссылка на неразрешенный внешний символ __imp__ModPlug_Read в функции _MODPLUG_Load Ошибка LNK2019: ссылка на неразрешенный внешний символ __imp__ModPlug_Unload в функции _MODPLUG_Load

Ошибка LNK2019: ссылка на неразрешенный внешний символ __imp__FLAC__stream_decoder_seek_absolute в функции _FLAC_Load

Ошибка LNK1120: 17 неразрешенных внешних

Дополнительные зависимости: (которые я добавил, беспомощно пытаясь решить эти ошибки): -

winmm.lib
версия.lib
libmpg123-0.lib
modplug.lib
libFLAC_static.lib

Настройки препроцессора: (внутри проекта SDL2_mixer): — (я подозреваю, что это может иметь какое-то отношение к этой ошибке, но все равно выглядит слишком хорошо): —

MUSIC_WAV
MUSIC_MOD_MODPLUG
MUSIC_OGG
MUSIC_FLAC
MUSIC_MP3_MPG123
MUSIC_MID_TIMIDITY
MUSIC_MID_NATIVE

Ошибки почти одинаковы для обоих проектов.

Я скачал modplug на GitHub из здесь, так это не официально.

И поверьте мне, создавать SDL_mixer с нуля всегда сложно.

Спасибо, что нашли время прочитать это.


person Ruks    schedule 25.08.2018    source источник
comment
Я не знаю ответа, но это имя libFLAC_static.lib мне кажется подозрительным. Он предлагает статическую ссылку, хотя из ваших ошибок ясно, что вы пытаетесь связать с DLL. Возможно, есть другая версия этой библиотеки, с которой вам следует связать.   -  person john    schedule 25.08.2018
comment
@john Я изменил тип проекта с Динамическая библиотека на Статическая библиотека, а также удалил все динамические препроцессоры из проекта SDL2_mixer внутри решения ( потому что они строят успешно). Примеры проектов на самом деле терпят неудачу.   -  person Ruks    schedule 25.08.2018
comment
Вы строите его как код C?   -  person user7860670    schedule 25.08.2018
comment
@VTT Да, я создаю его как код C. Я изменил тег с C++ на C.   -  person Ruks    schedule 25.08.2018
comment
@Ruks Имена, такие как __imp__ModPlug_Seek, являются явным признаком того, что компоновщик пытается связать с библиотекой импорта. Если это не так, значит, что-то не так в настройках вашего проекта.   -  person john    schedule 25.08.2018
comment
@john Но вот в чем проблема, так как я добавил имена библиотек (все это статические библиотеки, созданные исключительно мной с нуля), он упоминает внутри дополнительных зависимостей, надеясь, что он правильно свяжется, а также настройки проекта кажутся всеми хорошо мне.   -  person Ruks    schedule 25.08.2018
comment
@Ruks Вы понимаете разницу между библиотекой импорта и статической библиотекой?   -  person john    schedule 25.08.2018
comment
@john Библиотека, которая импортируется извне (вместе с экспортируемыми функциями и структурами) динамически (с DLL) или статически (без DLL) внутри программы/другой библиотеки, является библиотекой импорта, а статическая библиотека — это библиотека, которая создает свой исходный код. внутри основного целевого приложения вместо того, чтобы связываться с библиотекой динамической компоновки (DLL) извне.   -  person Ruks    schedule 25.08.2018
comment
@john Да, все библиотеки, которые связываются, являются статическими библиотеками (не динамическими библиотеками), и я не вижу, где что-то упоминается как ожидание DLL вместо этого (потому что я также удалил все динамические препроцессоры). ). К счастью, внутри основных проектов ошибок нет, только внутри проектов-примеров (playmus, playwave) (которые показывают те же ошибки, что и при компоновке в приложении). сам).   -  person Ruks    schedule 25.08.2018
comment
Вам необходимо определить макрос FLAC__NO_DLL, если вы хотите связать статические библиотеки FLAC. Для modplug вам нужно определить MODPLUG_STATIC.   -  person n. 1.8e9-where's-my-share m.    schedule 25.08.2018
comment
@н.м. Спасибо за ваш ответ, это сработало. Но не могли бы вы рассказать, как собрать и слинковать mpg123 статически? Потому что кажется, что при запуске требуется DLL mpg123 (хотя похоже, что его действительно сложно собрать с нуля, потому что у него нет configure или MakeFile). Я нашел это: stackoverflow.com/questions/15225894/, но это действительно не объясняет это ясно (например, о том, как настроить YASM или просто собрать его из решения внутри папки портов).   -  person Ruks    schedule 25.08.2018
comment
Извините, я очень мало знаю о сборке на Windows. Похоже, вам нужно скомпилировать с BUILD_MPG123_DLL и LINK_MPG123_DLL undefined, но я не могу сказать вам больше, чем это.   -  person n. 1.8e9-where's-my-share m.    schedule 25.08.2018
comment
@н.м. Хорошо, спасибо за ответ.   -  person Ruks    schedule 25.08.2018