我正在与 pocketsphinx 合作。它有 2 个 dll。 sphinxbase.dll
和 pocketsphinx.dll
。 pocketsphinx.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(); }
我认为这个解决方案对我来说是天真的。如果我选择这条路线,我需要包装数十个函数。
最佳答案
要认识到的一件事是,就像 exe 一样,dll 只是绑定(bind)到包中的一个或多个目标文件的集合。将目标文件组合成 dll/exe 是链接器的工作。如果要将两个 dll 合并为一个,请将组成这两个 dll 的目标文件合并为一个 dll。当您这样做时,您的引用将不再是对 dll 的引用,而是直接对对象本身的引用(将需要更改源代码,但主要是删除 dllimport),因此它应该是一个更直接的过程(包括 header 、make确保该对象包含在链接中)。您只需导出最终 dll 的使用者所需的那些函数即可。基本上将两个 dll 的源代码放入一个项目中。当然,我假设您拥有这些 dll 的源代码(这就是从给定的 url 中显示的样子)。如果最终出现循环依赖关系,您可能必须创建一些前向声明或附加头文件以使编译器满意。
关于c - 合并 C Dll 的最简单方法。有来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26613498/