Почему моя DLL загружается правильно, если указан абсолютный путь, а не относительный путь? - PullRequest
0 голосов
/ 24 февраля 2020

Я создал простой dll с использованием флага /MDd на windows 10 с использованием msvc 2019 компиляторов. dll содержит только простую функцию добавления (как во всех уроках). После создания этой библиотеки я скопировал ее в тестовую папку для явного связывания. По сути, тест проходит успешно, если я даю ему полный абсолютный путь к dll, но он не загружается, если я предоставляю только имя dll.

Вот код теста:

//test_add.cpp

#include <windows.h>
#include "gtest/gtest.h"

TEST(test, test_add_windows) {
#if defined(_WIN32) || defined (_WIN64)
    typedef int (*addPtr)(int, int);
    // full path works and the test passes
    HINSTANCE hinstLib = LoadLibrary(TEXT("D:\\ACrossPlatformCppLibrary\\test\\ACrossPlatformCppLibrary.dll"));
    // relative path does not work: library fails to load
//    HINSTANCE hinstLib = LoadLibrary(TEXT("ACrossPlatformCppLibrary.dll"));
    std::cout << hinstLib << std::endl;
    ASSERT_NE(hinstLib, nullptr);
    auto add = (addPtr) GetProcAddress(hinstLib, "add");
    ASSERT_NE(add, nullptr);
    int x = 5;
    int y = 6;
    int answer = add(x, y);
    ASSERT_EQ(answer, 11);
    BOOL fFreeResult = FreeLibrary(hinstLib);
#else
    ASSERT_TRUE(true);
#endif
}

И мое дерево каталогов

enter image description here

1 Ответ

0 голосов
/ 24 февраля 2020

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

TEST(test, test2) {
    char *fileExt;
    char szDir[256]; //dummy buffer
    GetFullPathName(".", 256, szDir, &fileExt);
    printf("Full path: %s\nFilename: %s", szDir, fileExt);
}

, который выводит:

Full path: D:\ACrossPlatformCppLibrary\cmake-build-debug\test

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

...