正确地将 DLL 与 C 程序捆绑在一起

Properly bundling DLLs with C programs

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

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

根据这张照片:

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

编辑: 我试过使用 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

好吧,您想要将您的应用程序与一个可执行文件和几个 DLL 文件打包在一起。你有几个选择。

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

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

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

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

参考:

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