Исполняемый файл отделен от DLL (это явное связывание?)

Я хочу, чтобы мои DLL находились в подкаталоге каталога, в котором находится мой исполняемый файл. Мой текущий каталог выглядит так:

Main Folder: [Folder]
Program.exe
sfml.dll
Assets [Folder]
Picture.png
Music.wav

Когда я действительно хочу, чтобы это выглядело так:

Main Folder: [Folder]
Program.exe
Assets [Folder]
Picture.png
Music.wav
MyDlls[Folder]
sfml.dll

Когда я пытаюсь поместить их (DLL) в папку, я получаю сообщение об ошибке:

Программа не может запуститься, потому что sfml-system-d-2.dll отсутствует на вашем компьютере. Попробуйте переустановить программу, чтобы решить эту проблему.

Итак, я посмотрел на явные ссылки и следовал инструкциям здесь:
http://www.dreamincode.net/forums/topic/118076-dlls-explicit-linking/

Если явные ссылки не то, что мне нужно использовать, то, пожалуйста, скажите мне, что мне нужно сделать. Иначе, пожалуйста, скажите мне, что не так с моим кодом ниже: (Кроме того, я не знаю, является ли это статическим или динамическим соединением .. ??)

// Startup.h
#ifndef STARTUP_H
#define STARTUP_H

#include <iostream>
#include <windows.h>

class Startup
{
private:
HINSTANCE hDLL;
public:
// Explicitly link SFML DLL's
typedef int(*funcAdd) (int, int);
typedef int(*funcSubtract) (int, int);
void LoadDLLs()
{
// Retrieve DLL handle.
vector<LPCSTR> libraries = {"openal32.dll",
"sfml-audio-2.dll",
"sfml-audio-d-2.dll",
"sfml-graphics-2.dll",
"sfml-graphics-d-2.dll",
"sfml-system-2.dll",
"sfml-system-d-2.dll",
"sfml-window-2.dll",
"sfml-window-d-2.dll"};
for (int i = 0; i < libraries.size(); i++)
{
hDLL = LoadLibrary(libraries[i]);
if (hDLL == NULL)
{
std::cout << "Failed to load library.\n";
}
else
{
funcAdd Add = (funcAdd)GetProcAddress(hDLL, "Add");
funcSubtract Subtract = (funcSubtract)GetProcAddress(hDLL, "Subtract");

if (Add)
std::cout << "10+10=" << Add(10, 10) << std::endl;

if (Subtract)
std::cout << "50-10=" << Subtract(50, 10) << std::endl;

FreeLibrary(hDLL);
}
std::cin.get();
}
};

#endif

0

Решение

Вы можете зарегистрировать Путь к приложению (см. Ссылку), убедившись, что вы добавили альтернативную папку DLL вашего приложения в значение PATH для пути к приложению.

1

Другие решения

Вы не можете делать то, что вы хотите напрямую. Прикрепленный код будет работать только для динамической загрузки DLL, но это не так.

То, что вы хотите сделать, будет зависеть от платформы, и вам нужно установить путь к библиотеке перед выполнением программы.

0

По вопросам рекламы [email protected]