【问题标题】:Why does my DLL load properly when given an absolute path but not a relative path?为什么我的 DLL 在给定绝对路径而不是相对路径时正确加载?
【发布时间】:2020-02-24 04:33:41
【问题描述】:

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

还有我的目录树

【问题讨论】:

    标签: c++ dll cmake


    【解决方案1】:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2016-11-23
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多