C ++ POSIX OO跨平台库,用于跨语言和编译器

时间:2015-02-02 12:07:27

标签: c++ windows visual-c++ cygwin integrity

这是我在这里提出的第一个问题,所以我为任何错误道歉,并尽量做到尽可能具体。 我们需要开发一个C ++ POSIX OO跨平台库,用于跨语言和编译器。由于我们需要能够在不同的操作系统上使用这个库,例如Windows,Linux和Android,以及一些像Integrity这样的嵌入式操作系统,我们决定在Cygwin或Mingw下开发它。库本身将是一个C ++面向对象的代码,POSIX标准。正如我已经提到的,我们需要能够跨不同语言加载和使用此库。因此,为了能够从托管代码中使用此库,我们首先考虑使用非托管MS Visual C ++代码包装它。在这里,我们将面临各种各样的问题。 Visual C ++使用不同的编译器,因此链接在Cygwin / Mingw下编译的C ++ OO库几乎是不可能的。主要问题是名称修改,并遵循不同的结构对齐问题,底层异常冲突和内存模型。 另一个选择是使用相同的代码,但使用不同的编译器进行编译,例如Cygwin和MS Visual C ++。此选项的问题是Visual C ++编译器不支持POSIX。

那么,是否有人遇到过同样的问题?有关如何开发这样一个库的想法,或者至少为不同的编译器重用代码?

非常感谢您对此的任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

解决方案是提供C ++类的“扁平”C包装器(这个概念大部分来自Rudy Velthuis:参见http://rvelthuis.de/articles/articles-cppobjs.html)。要展平类,请为每个类成员函数以及构造函数和析构函数创建一个C函数。构造函数的C包装器返回指向该类对象的指针。其他成员函数的包装器(包括析构函数)将此指针作为其第一个参数。这些C包装器必须具有外部“C”声明,由DLL导出并提供对C ++对象的间接访问(更多详细信息:http://www.aaronreeves.com/windows-dlls-part-3)。因此,对于外部单词,这样的DLL将看起来像用C编写的DLL。用C编写的DLL与来自各种来源的EXE非常好地工作。