【问题标题】:Building a Linux C++ API as a Windows DLL将 Linux C++ API 构建为 Windows DLL
【发布时间】:2011-11-07 23:56:15
【问题描述】:

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

我一直在查看how to build the DLL using cmake (by VTK) 上的各种在线指南(因为 cmake 通常用于构建 Avro),并且我想在花费大量时间尝试之前确保我正在尝试做的事情实际上是可行的去做吧。我还注意到cygwin guide 表明 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 has a decent amount of classes 以来这将是一项更加复杂的任务。如果我没有用 export 属性标记函数/类,而我使用 GCC 输出一个 DLL,那么是否会生成必要的导出符号,以便它们可以在 VS 项目中使用?

【问题讨论】:

  • 我认为在 msvc 中使用 g++ 编译的 dll 是不可能的。如果它导出的不仅仅是extern "C" 函数,则不会。见here
  • 我实际上无法解决主要问题,但是:如果可能,请摆脱 cygwin1.dll 依赖项。 (您可以在不停止使用 Cygwin 作为构建环境的情况下执行此操作。)Avro 或 Avro 生成的代码应该需要一个假的 Unix 环境,并将依赖于 Cygwin 的 DLL 与预计正常的 Windows 运行时环境会导致灾难。
  • @Zack 但 Avro 包含一些我只能通过 Cygwin 获得的 GNU 库。我有点陷入这种情况。

标签: c++ visual-studio-2010 gcc dll cygwin


【解决方案1】:

我创建了一个示例项目来尝试生成 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 的说明(有关为什么需要它们的更多信息,请参阅链接)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2012-01-14
    • 2010-11-27
    • 2012-12-19
    • 2016-08-18
    • 2022-12-18
    • 1970-01-01
    相关资源
    最近更新 更多