在尝试在另一个框架中编译一个应用程序时遇到问题。
现状:我想使用Intel OpenVINO的推理引擎进行深度学习推理。我能够编写一个.cpp并-使用cmake-创建一个可执行文件,它可以执行我想要的操作。但是,现在,我需要在C ++ Fluid Dynamics工具OpenFOAM中包含该功能。我想将对我在OpenFOAM中创建的两个向量的引用传递给OpenVINO的推理引擎。
问题:为了能够在OpenFOAM的运行时内调用推理引擎,我需要使用“ wmake”编译我的代码。我做了几次,您只需要使用正确的标头和共享库即可。但是,这次过程失败了:问题在于这两个工具之间存在命名空间冲突。我可以自己编译推理引擎代码,这样就创建了一个共享库。但是,要使用它,我必须在OpenFOAM代码中包括推理引擎头文件。一旦尝试编译,由于命名空间冲突,它将失败。我希望不要在后台更改任何代码。所以我正在寻找另一种解决方案。
问题:如前所述,我可以创建共享库,但是不能包含头文件。但是,我知道我的代码可以正常工作。据我所知,我无法将引用传递给可执行文件的参数,然后可执行文件会对其进行更改。因此,我正在寻找解决该问题的另一种方法。
有人知道我该怎么做吗?预先感谢!
答案 0 :(得分:0)
第一种通用方法:使用包装器。将您的代码添加到您编译的共享库中。包括不包含原始问题代码的代码。问题在于您编写了通常不需要的其他代码。
包装一些导致名称空间冲突的代码。它需要修改代码,无论是接受还是不接受。
您可以在已经煮熟的二进制文件中玩符号重命名。对于C语言来说,这通常很容易,但是对于C ++语言,您也可以成功。查看nm / objcopy(我不知道您使用的是什么操作系统,但我怀疑基于术语的linux)
了解冲突到底是什么,您可以使用一些#define,#include顺序来欺骗代码,或者删除“ using namespace”指令来避免上面的繁琐解决方案。
我建议按照#4,#2,#1,#3的顺序进行
答案 1 :(得分:0)
我相信有关避免链接冲突的指南可以为您提供帮助:
https://spin.atomicobject.com/2014/06/03/static-linking-c-plus-plus/
基本上,它可以让您通过预处理器或编译器标志来更改正在使用的2个库的名称空间。