C++ __declspec(dllexport)到dll的静态链接库

C++ __declspec(dllexport)到dll的静态链接库,c++,windows,dll,static-linking,dllexport,C++,Windows,Dll,Static Linking,Dllexport,我有一个简单的项目设置为OpenGL项目的大学 一个API项目,其中我想要使用的每个库(GLEW、GLFW、GLM)都是静态链接的。这些库应该与我自己的API代码组合成一个DLL文件 另一个项目应该只有一个依赖项,即DLL。抛出该DLL,它应该可以访问API代码和API内链接的所有库 我的问题是,在API中,我可以访问我链接的所有库的所有函数。但在实际项目中,API作为依赖项,我可以调用函数,编译器不会抛出错误(当然),因为函数声明在链接的头文件中,但链接器在DLL中找不到函数定义,这意味着AP

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

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

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

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

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

我定义了
\u GLFW\u BUILD\u 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
有什么帮助吗

编辑:

链接器选项:

/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下载源代码并自己构建,还必须删除我自己的glew构建选项中的
.res
文件。现在,API构建成功,但方法不是DLL的一部分。所以一切都没有改变。

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

但是,即使这看起来像是XY问题,为了实现您的目标,您也可以传递给链接器。为了区分要包含哪些.libs和不包含哪些,请为每个目标库指定一次标志:
/wholerchive:glew32.lib/wholerchive:glfw3.lib/wholerchive:glm.lib

查看更多详细信息

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

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

或者将.lib重建为静态但带有可导出符号。然而,OOTB很有可能不起作用(您可能需要修改一个文件或2或手动传递编译标志),因为这不是一种正常的方式(大多数人都会同意这是不允许的,特别是对于没有相当深的技术诀窍的人来说)。当您构建DLL时,您也会(或应该)这样做生成导入库-在某些方面,它看起来像一个静态库(在Windows上,它将具有
.lib
扩展名)。在构建调用DLL的应用程序时,必须确保链接器包含此库,因为这会告诉链接器相关函数是从DLL加载的(在运行时)。我已经这样做了。所以我可以使用我自己编写的API代码。在那里,原因链接器不会抛出任何LNK2019错误。但是,当我想调用例如
glfwMakeContextCurrent
glewInit
这是静态链接库中的函数时,链接器找不到它们,这意味着它们不是链接器包含的DLL或较小库的一部分。啊,好的-明白了。我需要再考虑一下。。。现在该睡觉了,我几小时后回来。(或者其他人可能会提供帮助。)在构建DLL时,您可能必须在中列出函数作为
EXPORTS
。但是,不确定这是否足以让EXE知道它们在那个DLL中。这是个坏主意。如果DLL的用户也使用OpenGL DLL怎么办?通常的方法是简单地将GL DLL与DLL一起重新分发。因此,我添加了/wholerchive选项。现在我看到LNK2005错误,即
user32.lib
gdi32.lib
想要重新定义
\uuuunull\u IMPORT\u描述符
,该描述符已在
kernel.lib
中定义,现在我得到错误,即
glew32s.lib
已被指定,因为我添加了LIBs作为附加依赖项。因此,在链接器选项中,有一个名为
/DYNAMICBASE
的选项,它已经指定了
glew32s.lib
。然后我尝试用标志
/wholerchive
/dynamicbase不需要任何名称来重新指定它。也许您应该在问题中放置linker命令。好的,3个添加的lib中的一个似乎与开头指定的lib不匹配。链接器输出(错误)也丢失。还有一些其他东西不见了,坦率地说,我不知道该怎么办,因为我不知道;I don’我不想通过评论询问每一条信息和调试。我可以上传项目吗?
/WHOLEARCHIVE:glew32s.lib
/WHOLEARCHIVE:glfw3.lib
/WHOLEARCHIVE:opengl32.lib