Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 混合C++;来自不同编译器的代码_C++_C_Windows_Swig - Fatal编程技术网

C++ 混合C++;来自不同编译器的代码

C++ 混合C++;来自不同编译器的代码,c++,c,windows,swig,C++,C,Windows,Swig,假设我有两个项目要链接在一起: 用Visual C++编译C++库到DLL文件。 使用C++ Builder编译的C++可执行文件,使用库中的类。 我意识到没有标准的C++ ABI,并且任何试图直接链接这两个C++项目的尝试都会失败。什么是一种自动创建兼容层的好方法,可以让我实现这一点 例如,可以想象C++库可以通过C接口来公开它自己。然后,可执行文件将有一些C++类,它们封装了C++库所公开的C接口。因为C有一个标准的ABI,所以它可以工作 唯一的问题是如何自动创建C接口和C++包装类——

假设我有两个项目要链接在一起:

  • 用Visual C++编译C++库到DLL文件。
  • 使用C++ Builder编译的C++可执行文件,使用库中的类。
<>我意识到没有标准的C++ ABI,并且任何试图直接链接这两个C++项目的尝试都会失败。什么是一种自动创建兼容层的好方法,可以让我实现这一点

例如,可以想象C++库可以通过C接口来公开它自己。然后,可执行文件将有一些C++类,它们封装了C++库所公开的C接口。因为C有一个标准的ABI,所以它可以工作

唯一的问题是如何自动创建C接口和C++包装类——手动维护这不是一个选项。SWIG项目看起来很有前途,但不幸的是,C++并不是他们网站上发布的Sigg的一个出口。有什么办法可以让SWIG满足我的需求吗?或者除了SWIG还有其他项目可以帮助我完成这项任务吗

还是我走错了方向


<强>编辑:核心C++库旨在跨平台。显然,可执行文件是特定于Windows的。我不想污染核心库,使其无法在其他平台上编译。

如果它只需要在Windows上运行,我会将这些类作为COM对象公开。它们仍然在DLL中,它们可以被任何理解COM的语言使用。

< P>为什么不用C++ Builder编译库?

< P> >在Windows中,“标准”的方式是使用COM对象。因此,这当然是一个很好的选择。在Linux系统中,模块交互模型(例如,可执行的DLL交互)是非常不同的,ABIs存在于C++中。 如果您想手动执行此操作(创建您自己的类似COM的库),那么这可能需要大量工作,但需要认真对待许多小问题。您将需要一个跨模块的RTTI系统,您将需要一个接口查询/定义协议,一些跨模块管理内存的机制,等等。除此之外,要“自动化”它,您可能需要宏和模板元函数的组合

一个跨平台的选项,我强烈建议您考虑或至少是使用BooS.python和Python语言作为模块之间的“胶水”。Pothon库基本上是“自动导出/导入类”,但它将您的C++类和函数作为Python类和函数导出。而且,它是完全非侵入式和跨平台的,因此这确实是一个自动化导出的理想示例。因此,您可能会考虑使用Python编写高级胶粘代码,或者使用Python作为C++模块之间的中间,甚至重做Boosi.python库,只使用“自动导出”机制导出到您设计或使用的任何接口系统。 我肯定还有很多其他类似的图书馆。当然,第一个问题是,你真的需要这个吗?你可能会用火箭筒来杀死苍蝇。

在SWIG上四处看看(我知道Sigg应该能够在C中包装C++):


如果核心库是跨平台的,为什么不把UI作为跨平台的QT应用程序编写,在Windows上用VisualC++ C++来构建所有的东西。该库旨在跨平台,因此在库中的“原始”类上直接使用ATL之类的东西是行不通的。(更不用说COM带来的DLL地狱了)。COM不会“带来DLL地狱”,如果你对某件事有问题,至少说你不喜欢它,而不是编造无稽之谈的借口。事实上,我们建议您现在就将它们设置为WinRT对象(这是一种COM对象),因为您很快就无法摆脱它们。对于将为您的方法生成存根的自动化工具(midl或DCE-RPC idl生成器(即跨平台)将实现这一点),您将获得进程内RPC调用,其效率几乎与普通函数调用一样高。+1用于努力保持核心业务逻辑跨平台。我们谈论的类/方法有多少。对一个C++类采取不透明指针并调用C++方法的C SHIMS虽然不难,但我承认它会变得乏味。对于初始项目——不是很多类。但是,可以将此视为更大项目的实践。这个项目最终会涉及到大量的后端类被移动到核心C++库中。我认为我们需要在那个时候自动生成代码。我同意写C是很容易的。只是最终会有太多的代码需要手动维护。跨平台和跨编译器是不同的。你的问题要具体。我可以是“跨平台”的,如果我对给定平台上的所有libs/可执行文件使用相同的编译器,那么你的问题就没有意义了。@Josh Petitt:核心逻辑最终应该在任何操作系统上运行,任何C++11编译器。用户界面代码可能更灵活——目前,C++和VCL。它可能特定于一个编译器/操作系统,也可能更通用。后来,它需要有灵活性,以用户界面为目标,如Qt、.NET WPF(我认为SWIG可以提供帮助)、其他本机小部件工具包——谁知道5年后下一个流行的小部件工具包会是什么?如果我们想编写一个现代的C++后端,我们正在寻找(1)lambda函数,(2)与TBB和OpenCV等库兼容,(3)一个性能良好的编译器(英特尔编译器和Visual C++都围绕C++ Builder运行)。这些是C++的东西