__declspec(dllexport)静态链接库到dll



我为大学的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:ProgrammierungC++-ProjekteCG-ProjectCGAPIbinDebugWin32CGAPI.dll" /MANIFEST /NXCOMPAT /PDB:"D:ProgrammierungC++-ProjekteCG-ProjectCGAPIbinDebugWin32CGAPI.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:ProgrammierungC++-ProjekteCG-ProjectCGAPIbinDebugWin32CGAPI.lib" /DEBUG /DLL /MACHINE:X86 /INCREMENTAL /PGD:"D:ProgrammierungC++-ProjekteCG-ProjectCGAPIbinDebugWin32CGAPI.pgd" /SUBSYSTEM:WINDOWS /MANIFESTUAC:NO /ManifestFile:"D:ProgrammierungC++-ProjekteCG-ProjectCGAPIbin-intDebugWin32CGAPI.dll.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"D:ProgrammierungC++-ProjekteCG-ProjectDependenciesGLFWWin32lib-vc2019" /LIBPATH:"D:ProgrammierungC++-ProjekteCG-ProjectDependenciesGLEWlibReleaseWin32" /TLBID:1 

我添加了一个:

/WHOLEARCHIVE:glew32s.lib
/WHOLEARCHIVE:glfw3.lib
/WHOLEARCHIVE:opengl32.lib

编辑2:

所以我必须从glew下载源代码并自己构建它,而且我还必须删除我自己的glew构建选项中的.res文件。现在API构建成功,但方法不是DLL的一部分。所以一切都没有改变。

我不完全理解你这样做的动机。常见的方法(我也会使用(是将OpenGL.dll(我不知道许可的含义(与您的一起发货。

但是,即使这看起来像是XY问题,为了实现您的目标,您也可以将[MS.Docs]:/WOLEARCHIVE(包括所有库对象文件(传递到链接器。为了区分要包括哪些.lib和不包括哪些,请为每个目标库指定一次标志:/wholearchive:glew32.lib /wholearchive:glfw3.lib /wholearchive:glm.lib

检查[SO]:导出链接到动态库的静态库中的符号(@CristiFati的回答(以了解更多详细信息。

注意:.lib必须使用可导出的符号构建。如果没有,你将不得不出口它们";"手动";,使用其他选项之一:

  • /EXPORT链接器选项

  • 模块定义(.def(文件

或将.lib重建为静态但具有可导出符号。然而,它很有可能不起作用(你可能需要修改文件或2或手动传递编译标志(,因为这不是一种正常的做事方式(大多数人都会同意这是一种NO-NO,尤其是对于没有相当深厚专业知识的人来说(。

最新更新