将Linux c++ API构建为Windows DLL
Building a Linux C++ API as a Windows DLL
我试图将c++ Avro API构建为DLL,以便我可以在Visual Studio项目中使用Avro生成的头文件。我能够使用Cygwin在Windows中构建Avro,所以下一步是将Avro API转换为DLL,并在我的项目中与cygwin1.dll
一起使用它(不完全清楚这将如何工作)。
我一直在看关于如何使用cmake(由VTK)构建DLL的各种在线指南(因为cmake通常用于构建Avro),我想确保我试图做的事情实际上是可行的,然后花费大量的时间试图做到这一点。我还注意到cygwin指南指出gcc编译器已经可以构建dll:
gcc -shared -o mydll.dll mydll.o
通常在windows中,我们必须在适当的地方使用__declspec(dllexport)
属性来指定需要导出哪些函数/类。谁能解释一下这一切应该是如何结合在一起的:
- 为了用Cygwin构建我的DLL,我是否必须标记所有具有出口属性的函数/类,如VTK指南中所示,或者我可以做些什么来告诉gcc编译器输出DLL而不使用出口属性(即改变
CMakeList.txt
文件中的cmake选项)? - 一旦我从cygwin生成DLL,那么在我的Visual Studio项目中,我必须引用
my.dll
和cygwin1.dll
?是"那么简单"还是我错过了什么?
如果我必须用export属性标记Avro中的所有函数/类,那么我可以想象这将是一个更加复杂的任务,因为Avro有相当数量的类。如果我不使用导出属性标记函数/类,并且我使用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)和一个共享库(.a)。然而,我无法成功地链接到DLL,尽管我应该能够根据cygwin FAQ上的答案:http://cygwin.com/faq/faq.programming.html#faq.programming.msvs-mingw
上面的链接还提供了如何生成.def和.lib的说明(有关为什么需要它们的更多信息,请参阅链接)。
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 从 Python 调用 Windows DLL 函数时出错
- C++UWP和经典桌面的通用Windows DLL
- 在特定 Windows DLL 模块中分配内存
- 清理跨越Windows DLL模块边界的堆分配资源时出现问题
- C++Windows DLL:不同函数中的异常处理
- Windows DLL 上的静态链接 libgcc
- Windows DLL实际上如何共享
- 使用Linux C代码和标头文件来编译Windows DLL
- windows DLL是否有可能在多个线程或进程之间使用相同的套接字编号
- 关于构建windows dll的建议
- Windows DLL 链接器错误与模板类
- 如何确定哪个 Windows DLL 用于函数调用
- 从C++ Windows DLL 文件中进行日志记录
- 将 mingw dll 与 Windows DLL 链接起来
- 其中 是 Windows DLL 中的字符串表
- C++ Windows DLL 使用 try-catch 块在内部失败
- Windows:DLL 中的元信息
- 在使用 CMake 构建 Windows DLL 期间运行单元测试
- windows DLL函数调用外部exe文件无效