构建Linux C++ API作为Windows DLL
我试图构建C++ Avro API作为DLL,因此我可以在Visual Studio项目中使用Avro生成的头文件。我可以使用Cygwin在Windows中构建Avro,因此下一步是将Avro API转换为DLL,并将其与我的项目中的cygwin1.dll
一起使用(并非完全清楚它如何工作)。构建Linux C++ API作为Windows DLL
我一直在寻找how to build the DLL using cmake (by VTK)各种在线指南(因为cmake通常用于建立Avro),我想确保我试图做的事情实际上是可行的,然后花费大量时间尝试做到这一点。我也注意到,cygwin guide表明gcc编译器已经可以建立动态链接库的
gcc -shared -o mydll.dll mydll.o
一般在我们窗口来指定哪些功能/类需要使用__declspec(dllexport)
属性在适当的出口。可能有人请澄清它是如何都应该走到一起:
- 为了建立我的Cygwin的DLL,我必须标记所有的功能/如图所示VTK指南中或可与出口属性类我只是做一些事情告诉gcc编译器输出一个DLL而不使用导出属性(即更改
CMakeList.txt
文件中的cmake选项)? - 一旦我从cygwin生成DLL,然后在我的Visual Studio项目中,我必须引用
my.dll
和cygwin1.dll
?是“那么简单”还是我错过了什么?
如果我必须用导出属性标记Avro中的所有函数/类,那么我可以想象它将是一个更复杂的任务,因为Avro has a decent amount of classes。如果我不用导出属性标记函数/类并使用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文件)和共享库(。一个)。但是,我没能成功地与DLL链接,但我应该能够根据对cygwin的常见问题的答案:http://cygwin.com/faq/faq.programming.html#faq.programming.msvs-mingw
上面的链接还提供了关于如何产生的.def和说明。 lib(请参阅链接了解更多信息,了解它们为什么需要它们)。
我不认为有可能在msvc中使用用g ++编译的dll。如果它输出的东西超过'extern“C”'函数,则不是。看到[这里](http://stackoverflow.com/questions/2472924/linking-to-msvc-dll-from-mingw) –
我实际上不能帮助主要问题,但:摆脱'cygwin1。如果可能的话,可以依赖dll。 (您可以在不停止使用Cygwin作为构建环境的情况下执行此操作。)Avro或Avro生成的代码应该*需要假的Unix环境,以及将Cygwin依赖的DLL与期望正常Windows运行时的DLL混合在一起没有明显的原因环境是灾难的秘诀。 – zwol
@Zack但Avro包含一些我只能用Cygwin获得的GNU库。我有点陷入这种情况。 – Kiril