我使用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
}
和我的目录树
我想出了答案。我从同一文件运行了另一个测试以获取当前目录:
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
复制到了源目录,而不是构建目录。