首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__declspec(dllexport)静态链接库

__declspec(dllexport)静态链接库
EN

Stack Overflow用户
提问于 2020-04-07 23:43:28
回答 1查看 610关注 0票数 1

我有一个简单的项目设置一个OpenGL-项目为大学。

一个API项目,我想使用的每个库(GLEW,GLFW,GLM)都是静态链接的。这些库应该与我自己的API代码结合到一个DLL文件中。

另一个项目应该只有一个依赖项,即DLL。抛出这个DLL,它应该可以访问API代码和API中链接的所有库。

我的问题是,在API中,我可以访问我所链接的所有库的所有函数。但是在具有API作为依赖项的实际项目中,我可以调用函数,编译器不会抛出错误(当然),因为函数声明在链接的头文件中,但是链接器没有在DLL中找到函数定义,这意味着API的构建不会将链接库导出到DLL中。

在API项目中,我还定义了必要的预处理前定义:

我定义了_GLFW_BUILD_DLL:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

有什么帮助吗?

编辑:

链接器选项:

代码语言:javascript
复制
/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 

我说的那个:

代码语言:javascript
复制
/WHOLEARCHIVE:glew32s.lib
/WHOLEARCHIVE:glfw3.lib
/WHOLEARCHIVE:opengl32.lib

编辑2:

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

EN

回答 1

Stack Overflow用户

发布于 2020-04-08 14:43:00

我不完全理解你这么做的动机。常见的方法(我也会使用)是将OpenGL _.dll_s (我不知道授权的含义)与您的一起发送。

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

有关更多细节,请查看[SO]:将链接到动态库的静态库中的符号导出(@CristiFati的答案)

请注意:_.lib_s必须是用可出口的符号建造的。如果没有,则必须使用其他选项之一“手动”导出它们:

  • /EXPORT链接器选项
  • 模块定义(.def)文件

或者将.lib重新构建为静态的,但带有可导出的符号。但是,OOTB很有可能无法工作(您可能需要修改一个文件或2,或者手动传递编译标志),因为这不是一种正常的方法(大多数人都会同意这是不可能的,特别是对于那些对事情没有相当深入的了解的人)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61091164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档