c - 合并 C Dll 的最简单方法。有来源

标签 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(); }

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

最佳答案

要认识到的一件事是,就像 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/

相关文章:

c - 随机猜谜游戏卡住了

c - setsockopt (sys/socket.h)

c++ - Windows 嵌入式标准不是有效的 win32 c++

windows - 如何使用 Win32::API 调用 Win32 DLL void** 参数?

c - 为什么我得到 "error: too few arguments to function ‘sock->ops->accept’"

c - 指针到指针相互转换

python - 如何确保应用程序窗口始终在最前面?

c++ - 在哪个头文件中声明了函数 `_tcscpy_s`?

c# - 在这种特定且非常简单的情况下,为什么 Debug 不同于 Release?

visual-studio - TypeScript AMD 无法使用自定义 require.config baseUrl 解析外部模块