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:
- 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)? - Once I generate a DLL from cygwin, then in my Visual Studio project I must reference both
my.dll
and thecygwin1.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).
精彩评论