У меня есть простая настройка проекта для OpenGL-проекта для университета.
Проект API, в котором каждая библиотека, которую я хочу использовать (GLEW, GLFW, GLM), связана статически. Эти библиотеки должны быть объединены с моим собственным кодом API в один файл DLL.
Другой проект должен иметь только одну зависимость, DLL. Бросьте эту DLL, она должна получить доступ к коду API и всем библиотекам, связанным внутри API.
Моя проблема в том, что внутри API у меня есть доступ ко всем функциям всех библиотек, с которыми я связан. Но внутри самого проекта, который имеет API в качестве зависимости, я могу вызывать функции, и компилятор не выдает ошибку (причины), потому что объявление функции находится в связанных заголовочных файлах, но компоновщик не находит определение функции внутри DLL, что означает, что сборка API не экспортирует связанные библиотеки в DLL.
В проекте API я также определил необходимые определения препроцессора:
Я определил _GLFW_BUILD_DLL:
from "glfw3.h" l. 233-245
/* GLFWAPI is used to declare public API functions for export
* from the DLL / shared library / dynamic library.
*/
#if defined(_WIN32) && defined(_GLFW_BUILD_DLL)
/* We are building GLFW as a Win32 DLL */
#define GLFWAPI __declspec(dllexport) <----- this one is active
#elif defined(_WIN32) && defined(GLFW_DLL)
/* We are calling GLFW as a Win32 DLL */
#define GLFWAPI __declspec(dllimport)
#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL)
/* We are building GLFW as a shared / dynamic library */
#define GLFWAPI __attribute__((visibility("default")))
#else
/* We are building or calling GLFW as a static library */
#define GLFWAPI
#endif
Я определил GLEW_BUILD:
from "glew.h" l. 200-208
#ifdef GLEW_STATIC
#define GLEWAPI extern
#else
#ifdef GLEW_BUILD
#define GLEWAPI extern __declspec(dllexport) <---- this one is active
#else
#define GLEWAPI extern __declspec(dllimport)
#endif
#endif
Любая помощь?
РЕДАКТИРОВАТЬ:
Параметры компоновщика:
/OUT:"D:\Programmierung\C++-Projekte\CG-Project\CGAPI\bin\Debug\Win32\CGAPI.dll" /MANIFEST /NXCOMPAT /PDB:"D:\Programmierung\C++-Projekte\CG-Project\CGAPI\bin\Debug\Win32\CGAPI.pdb" /DYNAMICBASE "glew32s.lib" "glfw3.lib" "opengl32.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /IMPLIB:"D:\Programmierung\C++-Projekte\CG-Project\CGAPI\bin\Debug\Win32\CGAPI.lib" /DEBUG /DLL /MACHINE:X86 /INCREMENTAL /PGD:"D:\Programmierung\C++-Projekte\CG-Project\CGAPI\bin\Debug\Win32\CGAPI.pgd" /SUBSYSTEM:WINDOWS /MANIFESTUAC:NO /ManifestFile:"D:\Programmierung\C++-Projekte\CG-Project\CGAPI\bin-int\Debug\Win32\CGAPI.dll.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"D:\Programmierung\C++-Projekte\CG-Project\Dependencies\GLFW\Win32\lib-vc2019\" /LIBPATH:"D:\Programmierung\C++-Projekte\CG-Project\Dependencies\GLEW\lib\Release\Win32\" /TLBID:1
Тот, который я добавил:
/WHOLEARCHIVE:glew32s.lib
/WHOLEARCHIVE:glfw3.lib
/WHOLEARCHIVE:opengl32.lib
РЕДАКТИРОВАТЬ 2:
Поэтому мне пришлось скачать исходный код с glew и собрать его я, а также мне пришлось удалить файл .res
внутри опции моей собственной сборки glew. Теперь API строится успешно, но методы не являются частью DLL. Так что ничего не изменилось.