开发者

Building a Linux C++ API as a Windows DLL

I'm attempting to build the C++ Avro API as a DLL so I can use the Avro generated header files in a Visual Studio project. I'm able to build Avro in Windows using Cygwin, so the next step is to convert the Avro API into a DLL and use it along with the cygwin1.dll in my project (not entirely clear on how this would work either).

开发者_JAVA百科I've been looking at various online guides on how to build the DLL using cmake (by VTK) (since cmake is generally used to build Avro) and I wanted to make sure that what I'm attempting to do is actually feasible before spending a ton of time trying to do it. I've also noticed that the cygwin guide indicates that the gcc compiler can already build DLLs:

gcc -shared -o mydll.dll mydll.o

Generally in windows we have to specify which functions/classes needs to be exported by using the __declspec(dllexport) attribute where appropriate. Could anybody please clarify how it's all supposed to come together:

  1. In order to build my DLL with Cygwin, do I have to mark all of the functions/classes with the export attribute as shown in the VTK guide or can I just do something to tell the gcc compiler to output a DLL without using the export attributes (i.e. change the cmake options in the CMakeList.txt file)?
  2. Once I generate a DLL from cygwin, then in my Visual Studio project I must reference both my.dll and the cygwin1.dll? Is it "that simple" or am I missing something?

If I have to mark all of the functions/classes in Avro with the export attribute, then I can imagine it will be a significantly more involved task since Avro has a decent amount of classes. If I don't mark the functions/classes with the export attribute and I use GCC to output a DLL, then will the necessary export symbols be generated so they can be used in a VS project?


I made a sample project that attempts to generate the DLL and this is what I had in my 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" )

The resulting output is a DLL (.dll) and a shared library (.a). However, I wasn't able to successfully link with the DLL, although I should be able to according to an answer on the cygwin FAQ: http://cygwin.com/faq/faq.programming.html#faq.programming.msvs-mingw

The above link also provides instructions on how to generate the .def and the .lib (see the links for more info on why they're needed).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜