为什么在给定绝对路径而不是相对路径的情况下,我的DLL能否正确加载?

问题描述 投票:0回答:1

我使用dll编译器在/MDd上使用windows 10标志创建了一个简单的msvc 2019dll仅包含一个简单的添加功能(就像所有教程中一样)。构建此库后,我将其复制到测试文件夹中以进行显式链接。基本上,如果我给它提供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

c++ dll cmake
1个回答
0
投票

我想出了答案。我从同一文件运行了另一个测试以获取当前目录:

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复制到了源目录,而不是构建目录。

© www.soinside.com 2019 - 2024. All rights reserved.