Построение Linux C ++ API как Windows DLL - PullRequest
0 голосов
/ 01 сентября 2011

Я пытаюсь создать C ++ Avro API как DLL, чтобы я мог использовать сгенерированные Avro заголовочные файлы в проекте Visual Studio.Я могу собрать Avro в Windows с помощью Cygwin, поэтому следующий шаг - преобразовать Avro API в DLL и использовать его вместе с cygwin1.dll в моем проекте (не совсем понятно, как это будет работать).

Я смотрел на различные онлайн-руководства по , как собрать DLL с помощью cmake (от VTK) (поскольку cmake обычно используется для сборки Avro), и я хотел убедиться, чтото, что я пытаюсь сделать, на самом деле выполнимо, прежде чем тратить кучу времени, пытаясь это сделать.Я также заметил, что руководство cygwin указывает, что компилятор gcc уже может создавать библиотеки DLL:

gcc -shared -o mydll.dll mydll.o

Обычно в окнах мы должны указывать, какие функции / классы должны быть экспортированыпри необходимости используйте атрибут __declspec(dllexport).Кто-нибудь может уточнить, как все это должно собираться вместе:

  1. Чтобы собрать мою DLL с помощью Cygwin, нужно ли помечать все функции / классы атрибутом экспорта, как показано в VTKруководство или я могу просто сделать что-то, чтобы сказать компилятору gcc вывести DLL без использования атрибутов экспорта (т.е. изменить параметры cmake в файле CMakeList.txt)?
  2. Как только я сгенерирую DLL из cygwin, тогдав моем проекте Visual Studio я должен ссылаться на my.dll и cygwin1.dll?Это " так просто " или я что-то упустил?

Если мне нужно пометить все функции / классы в Avro атрибутом экспорта, то я могу себе это представитьбудет значительно более сложной задачей, поскольку Avro имеет приличное количество классов .Если я не помечаю функции / классы атрибутом экспорта и использую GCC для вывода DLL, будут ли сгенерированы необходимые символы экспорта, чтобы их можно было использовать в проекте VS?

1 Ответ

0 голосов
/ 13 сентября 2011

Я создал пример проекта, который пытается сгенерировать 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: http://cygwin.com/faq/faq.programming.html#faq.programming.msvs-mingw

Приведенная выше ссылка также содержит инструкции о том, как сгенерировать.def и .lib (см. ссылки для получения дополнительной информации о том, зачем они нужны).

...