【问题标题】:Properly bundling DLLs with C programs将 DLL 与 C 程序正确捆绑
【发布时间】:2021-10-04 20:46:14
【问题描述】:

我一直在尝试将一些 DLL 库与我的 C 程序捆绑在一起。我可以将我需要的 DLL 粘贴到可执行文件的目录中,它工作正常。

我需要将可执行文件夹中的文件整理到其他文件夹中。 我的问题是,每当我将 DLL 文件移动到另一个文件夹(在可执行目录中)时,可执行文件都无法找到这些 DLL 文件。

根据这张照片:

我不想向环境路径添加新值,也不想接触可执行目录之外的其他文件夹。 有没有办法告诉我的可执行文件在我的可执行文件目录的文件夹中查找 DLL 文件?我可以将 DLLs 文件夹的名称更改为另一个名称,以便可执行文件可以访问这些文件吗?请帮帮我!

编辑:我尝试使用chdir() 函数更改“当前目录”。我的方法不起作用,知道为什么吗?

#include <unistd.h> //Used for chdir()

int Start(int argc, char *argv[]);

int main(int argc, char *argv[]){

    chdir("/bin/"); //change the "current directory" to "bin/"

    return Start(argc, argv);

}

#include "./program.c" //Includes the `Start()` function

【问题讨论】:

  • 我不知道具体,所以只是一个评论。但逻辑要求可执行文件需要知道在哪里可以找到 DLLS。如果它们不在某个环境(例如 Windows)已经检查过的地方,并且它们不在可执行文件知道的地方(即可执行文件目录./),那么剩下的选择是对可执行文件中的路径进行硬编码(如果可能的话),这似乎不是一个好主意。
  • 将 DLL 与可执行文件放在同一目录有什么问题?这就是通常的做法。
  • @Jabberwock,我只是希望文件更有条理。
  • @EnderAdel 这没什么用,现在程序是通过开始菜单或某些链接或命令行启动的。没有人应该浏览到可执行文件所在的目录并双击可执行文件。
  • @Jabberwocky,我知道。问题是有问题的程序不是我的,我需要这个“程序模板”中的所有文件都易于理解和组织。

标签: c windows dll bundle


【解决方案1】:

好吧,你想用一个可执行文件和几个 DLL 文件来打包你的应用程序。您有多种选择。

  1. 不要那样做,这不会带来很多附加值

  2. 又快又脏:您可以将可执行文件和 DLL 文件放在同一个目录中,并添加一个 BAT 文件,将 %PATH% 更改为 set PATH=%PATH%;%CD%\dlls,然后启动您的程序

  3. 您可以从您想要的目录手动加载带有LoadLibrary 的 DLLs 文件,这会带来额外的工作,因为您需要从您的 DLLs 中一一检索所有函数并将它们存储到指针中(指向函数的指针,这是来自SDL库的方法,你可以看到下面的链接)

  4. 最后一个选项,您可以将您的可执行文件与您的DLL 放在同一目录中并编写一个附加程序,我们称之为starterloader,该任务仅用于启动好的可执行文件。这将是我的首选方法。

参考:

https://github.com/libsdl-org/SDL/blob/c59d4dcd38c382a1e9b69b053756f1139a861574/src/core/windows/SDL_xinput.c

【讨论】:

  • 我没有得到选项4,这不是他在问题第一句话中描述的吗?那么启动器/加载器的意义何在?
  • 加载器的要点是您不需要处理 DLL 位置,因为它们将与您的主程序位于同一目录中。因此,您无需更改当前程序的代码。您只需编写一个非常小的starter 来启动位于具有DLLs 的子目录中的主程序(基本上使用GetModuleFilenameCreateProcess
  • 我还是不明白。
  • 您可以拥有一个包含“my-program.exe”的目录和一个子目录“dlls”。这在某种程度上看起来很干净,用户不会因为只有 2 个元素而感到困惑,他只需单击“my-program.exe”即可启动程序。在后台,“my-program.exe”只是执行“dlls\program.exe”。
  • 但选项 1) 在我看来是一个非常合理的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 2011-11-02
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 2021-07-19
  • 2017-10-18
相关资源
最近更新 更多