c++ - __declspec(dllexport) 静态链接库到 dll

标签 c++ windows dll static-linking dllexport

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

我想使用的每个库(GLEW、GLFW、GLM)都是静态链接的 API 项目。这些库应该与我自己的 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 build 选项中的文件。现在 API 构建成功,但方法不是 DLL 的一部分。所以什么都没有改变。

最佳答案

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

然而,即使 这看起来像一个 XY 问题 ,为了实现你的目标,你可以通过[MS.Docs]: /WHOLEARCHIVE (Include All Library Object Files)到链接器。为了区分哪些 .lib 包含哪些不包含,请为每个目标库指定一次标志:/wholearchive:glew32.lib /wholearchive:glfw3.lib /wholearchive:glm.lib .

查看[SO]: Exporting symbols in static library that is linked to dynamic library (@CristiFati's answer)更多细节。

注意:.libs 必须使用可导出的符号构建。如果没有,您必须使用其他选项之一“手动”导出它们:

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

  • 或将 .lib 重建为静态但带有可导出符号。但是,它很有可能无法运行 OOTB(您可能需要修改文件或 2 或手动传递编译标志),因为这不是一种正常的方式(大多数人会同意这是一个 NO-NO,特别是对于那些没有相当深厚的专业知识的人)做事。

    关于c++ - __declspec(dllexport) 静态链接库到 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61091164/

    相关文章:

    c++ - 使用另一个模板的模板

    c# - 用于处理 C++ 类型的类型编码(marshal)处理

    c++ - 如何超越现有文件的结尾?

    c++ - 在 C++ 中创建基本矩阵的困难

    c++ - 在 OpenGL ES 2.0 中测量渲染到纹理的性能

    c++ - 没有功能包的 VS 2008 的简单 C++ 正则表达式库

    windows - 确定 “System Load”

    c# - 为什么我收到 "' 某个类'不包含 'some method' 的定义“错误,而该类具有该方法?

    c++ - 无法让 DLL 在 Visual Studio 上工作

    c++ - DLL 共享数据部分不存在错误