У меня есть программа, использующая OpenGL 3.2 (+ libs) и FreeType2. Затем другая программа с Boost и OpenSSL. Сторона OpenGL должна была гарантировать, что текст может быть отображен, а программа boost / openssl должна сделать защищенный сервер входа / игры.
Обе программы работают самостоятельно.
Однако добавление Boost и OpenSSL в игровой проект (GL + freetype) привело к тому, что он не смог установить связь.
Я связал следующие библиотеки, а также включил туда папку «включает».
glimg.lib
glutil.lib
glfw.lib
opengl32.lib
freetype.lib
glew32.lib
user32.lib
libeay32.lib
ssleay32.lib
Ошибка компоновщика есть.
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol __imp__DeregisterEventSource@4
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol __imp__ReportEventA@36
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol __imp__RegisterEventSourceA@8
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__DeleteDC@4
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__DeleteObject@4
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__GetBitmapBits@12
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__BitBlt@36
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__GetObjectA@12
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__SelectObject@8
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__CreateCompatibleBitmap@12
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__GetDeviceCaps@8
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__CreateCompatibleDC@4
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__CreateDCA@16
1>.\BasicTexture.exe : fatal error LNK1120: 13 unresolved externals
Библиотека времени выполнения установлена в многопоточную DLL (/ MD)
Я понятия не имею, что делать, я был бы очень признателен за любую помощь.
Неразрешенные внешние сообщения об ошибках генерируются, когда компилятор генерирует код, ссылающийся на внешние объекты или функции, и компоновщик не может их найти. Для генерации кода, вызывающего вызов функции, компилятору нужно только объявление:
extern "C" BOOL DeregisterEventSource ( HANDLE hEventLog );
Этого достаточно информации, чтобы произвести call
инструкция (кроме целевого адреса). extern
Ключевое слово сообщает компилятору, что реализация определена в другом месте. Следовательно, он не может знать целевой адрес, который должен быть заполнен позже. Когда компилятор готов, линкер соединяет части вместе. Он использует информацию, собранную из библиотек импорта, для поиска необходимых смещений.
Вызовы Windows API легко обнаруживаются в журнале ошибок. У них есть __imp__
префикс и иногда A
или же W
постфикс с последующим @<n>
где <N> указывает количество байтов, необходимых для аргументов. В случае вызова Windows API вы можете найти функцию в MSDN (например, DeregisterEventSource). Внизу находятся Требования где вы можете найти имя библиотеки импорта.
Предупреждение о конфликте указывает на то, что не все модули используют одну и ту же библиотеку времени выполнения. Хотя это всего лишь предупреждение, это серьезная проблема, и ее следует решить. Вы получите это предупреждение, если смешаете /MD
а также /MT
переключатели компилятора, но также, если вы смешиваете библиотеки выпуска и отладки среды выполнения (например, /MD
а также /MDd
). Для диагностики этого сообщения вы можете использовать /VERBOSE:LIB
переключатель компоновщика, чтобы определить, какие библиотеки ищет компоновщик. Дополнительную информацию об этом предупреждении можно найти на этом MSDN ссылка.
Вы пытаетесь скомпилировать /MD
, что, вероятно, является правильным выбором, но некоторый код (возможно, одна из библиотек) был построен с /MT
, и вы не можете иметь оба пути в одной и той же программе. Вы должны выяснить, какая библиотека была построена с /MT
и восстановить его с /MD
,