__declspe c (dllexport) stati c связанные библиотеки для dll - PullRequest
1 голос
/ 08 апреля 2020

У меня есть простая настройка проекта для 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. Так что ничего не изменилось.

1 Ответ

1 голос
/ 08 апреля 2020

Я не совсем понимаю вашу мотивацию делать что-то таким образом. Обычный подход (который я бы также использовал) - это отправка OpenGL .dll s (я не знаю о последствиях лицензирования) вместе с вашими.

Однако, даже если это выглядит как XY Проблема , для достижения вашей цели вы можете передать [MS.Docs]: / WHOLEARCHIVE (Включить весь объект библиотеки Файлы) на компоновщик. Чтобы различить, какие .lib s включить, а какие нет, укажите флаг один раз для каждой целевой библиотеки: /wholearchive:glew32.lib /wholearchive:glfw3.lib /wholearchive:glm.lib.

Check [SO]: экспорт символов в stati c библиотека, которая связана с динамической c библиотекой (ответ @CristiFati) для получения более подробной информации.

Примечание: .lib s должно быть построено с экспортируемыми символами. Если нет, вам придется экспортировать их «вручную», используя один из других вариантов:

  • / EXPORT опция компоновщика
  • Определение модуля ( .def ) файлы

или перестройте .lib как stati c, но с экспортируемыми символами. Тем не менее, есть большая вероятность, что он не будет работать OOTB (вам, вероятно, потребуется изменить файл или 2 или вручную передать флаг компиляции), так как это ненормальный способ (большинство людей согласится это НЕТ-НЕТ , особенно для тех, у кого нет достаточно глубоких знаний) в выполнении дел.

...