合并C Dlls的最简单方法。有来源

时间:2014-10-28 16:27:54

标签: c windows visual-studio dll

我正在使用pocketsphinx。它有2个dll。 sphinxbase.dllpocketsphinx.dllpocketsphinx.dll调用sphinxbase.dll中的函数。我将在两者中调用函数。我想知道将两个源文件合并为生成单个dll的最简单方法。

我之前尝试过这个但是我遇到了使用sphinxbase的pocketsphinx问题导致关于导入我正在尝试导出的函数的警告/错误。

解决这个问题的常见解决方案是什么? 我应该从sphinbase中删除dllexport标签,然后将这些函数包装在我导出的其他函数中吗?

实施例

//inside sphinxbase
SPHINXBASE_DLL_EXPORT
void sphinxbasefunc();


//inside pocketsphinx
POCKETSPHINX_DLL_EXPORT
char* decode(ps_decoder_t decoder)
{
  ...
  sphinxbasefunc();
  ...
}

然后我将删除SPHINXBASE_DLL_EXPORT宏并创建一个我将导出的包装器。

//inside sphinxbase
void sphinxbasefunc();

WRAPPER_DLL_EXPORT
void sphinxbasefunc_wrapper() { sphinxbasefunc(); }

我认为这个解决方案本身就是天真的。如果我采取这条路线,我需要包装许多功能。

1 个答案:

答案 0 :(得分:0)

要实现的一件事就像exe,dll只是绑定到包中的一个或多个目标文件的集合。将目标文件组合成dll / exes是链接器的工作。如果要将两个dll组合成一个,请将组成两个dll的目标文件合并为一个dll。当你这样做时,你的引用将不再是dll,而是直接到对象本身(需要更改源代码,但这主要是删除dllimports),所以它应该是一个更直接的过程(包括标题,make确保对象包含在链接中)。您只需要导出最终dll的使用者所需的那些功能。基本上将两个dll的源代码放在一个项目中。我当然假设你有这些dll的来源(这是从给出的url中看出来的)。如果最终得到循环依赖,则可能必须创建一些前向声明或其他头文件以使编译器满意。