将Linux c++ API构建为Windows DLL

Building a Linux C++ API as a Windows DLL

本文关键字:Windows DLL 构建 API Linux c++      更新时间:2023-10-16

我试图将c++ Avro API构建为DLL,以便我可以在Visual Studio项目中使用Avro生成的头文件。我能够使用Cygwin在Windows中构建Avro,所以下一步是将Avro API转换为DLL,并在我的项目中与cygwin1.dll一起使用它(不完全清楚这将如何工作)。

我一直在看关于如何使用cmake(由VTK)构建DLL的各种在线指南(因为cmake通常用于构建Avro),我想确保我试图做的事情实际上是可行的,然后花费大量的时间试图做到这一点。我还注意到cygwin指南指出gcc编译器已经可以构建dll:

gcc -shared -o mydll.dll mydll.o

通常在windows中,我们必须在适当的地方使用__declspec(dllexport)属性来指定需要导出哪些函数/类。谁能解释一下这一切应该是如何结合在一起的:

  1. 为了用Cygwin构建我的DLL,我是否必须标记所有具有出口属性的函数/类,如VTK指南中所示,或者我可以做些什么来告诉gcc编译器输出DLL而不使用出口属性(即改变CMakeList.txt文件中的cmake选项)?
  2. 一旦我从cygwin生成DLL,那么在我的Visual Studio项目中,我必须引用my.dllcygwin1.dll ?是"那么简单"还是我错过了什么?

如果我必须用export属性标记Avro中的所有函数/类,那么我可以想象这将是一个更加复杂的任务,因为Avro有相当数量的类。如果我不使用导出属性标记函数/类,并且我使用GCC输出DLL,那么将生成必要的导出符号,以便它们可以在VS项目中使用?

我做了一个示例项目,试图生成DLL,这就是我在CMakeLists.txt中的内容:

PROJECT(DLLTest)
# Allow the developer to select if Dynamic or Static libraries are built
OPTION (BUILD_SHARED_LIBS "Build Shared Libraries" ON)
# Set the LIB_TYPE variable to SHARED
SET (LIB_TYPE SHARED)
#IF (BUILD_SHARED_LIBS)
  # User wants to build Dynamic Libraries, so change the LIB_TYPE variable to CMake keyword 'SHARED'
#  SET (LIB_TYPE SHARED)
#ENDIF (BUILD_SHARED_LIBS)
# Create a target for the library
ADD_LIBRARY(DLLTest ${LIB_TYPE} hello.cpp)
SET( EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/bin" )
SET( LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/lib" )

结果输出是一个DLL (. DLL)和一个共享库(.a)。然而,我无法成功地链接到DLL,尽管我应该能够根据cygwin FAQ上的答案:http://cygwin.com/faq/faq.programming.html#faq.programming.msvs-mingw

上面的链接还提供了如何生成.def和.lib的说明(有关为什么需要它们的更多信息,请参阅链接)。