【问题标题】:Easiest way to merge C Dlls. Have Source合并 C Dll 的最简单方法。有源
【发布时间】:2014-12-24 03:54:08
【问题描述】:

我正在与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(); }

我认为这个解决方案对我来说是天真的。如果我走这条路,我需要包装几十个函数。

【问题讨论】:

  • 我在 Unity 中工作,Unity 有一个错误,它只会加载单个 dll。常见的解决方法是将依赖 dll 放在单独的位置,但是您无法通过脚本访问依赖 dll。
  • 啊,有道理。 (虽然是丑陋的错误。)感谢您的解释。 :-)

标签: c windows visual-studio dll


【解决方案1】:

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

【讨论】:

  • 我想我明白了,但我不确定它是否会起作用。你告诉我创建目标文件。然后为那些包含我所有 dllexports 的目标文件创建一个新的头文件?这是否允许我导出在目标文件本身中使用的函数?这也可以使用静态库而不是一堆目标文件吗?
  • 它应该可以工作,只需将您的导入视为直接引用(因为它们不再被导入)。不利的一面是,当库更改时,您将需要重新编译(您不能只是将新的 dll 放在适当的位置),但是任何物理合并 dll 的东西都会导致同样的问题。
猜你喜欢
  • 2023-03-03
  • 2021-12-13
  • 2015-11-07
  • 2016-05-04
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多