【问题标题】:Unresolved externals when compiling code which uses a dll编译使用 dll 的代码时未解决的外部问题
【发布时间】:2011-08-13 02:13:54
【问题描述】:

我正在尝试开始在 VS 2005 中为我的代码使用 dll。我的代码非常简单,只是为了尝试一个测试用例。

testdll.h:

#ifdef TEST_EXPORTS
#define TESTDLLPORT   __declspec( dllexport )
#else
#define TESTDLLPORT   __declspec( dllimport )
#endif

namespace TestDLLNS
{
    static int s = 0;
    class MyTestDll {
    public:
        static TESTDLLPORT int printDLLFuncs();
    };
}

testdll.cpp:

// testdll.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "testdll.h"

#ifdef _MANAGED
#pragma managed(push, off)
#endif

namespace TestDLLNS {
    int MyTestDll::printDLLFuncs() {
        cout << "DLL function called" << endl;
        return s;
    }
}
#ifdef _MANAGED
#pragma managed(pop)
#endif

test.cpp:

// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "testdll.h"

int main(int argc, char* argv[])
{
    cout << "int: " << TestDLLNS::MyTestDll::printDLLFuncs() << endl;
    cout << "Called dll" << endl;
    return 0;
}

错误 1 ​​错误 LNK2019:无法解析的外部符号“__declspec(dllimport) public: static int _cdecl TestDLLNS::MyTestDll::printDLLFuncs(void)”(_imp_?printDLLFuncs@MyTestDll@TestDLLNS@@ SAHXZ) 在函数 _main test.obj 中引用

dumpbin \exports testdllD.dll 给出以下内容: 序号提示 RVA 名称

      1    0 0001105F ?printDLLFuncs@MyTestDll@TestDLLNS@@SAHXZ

所以符号显然存在于 .dll 中。 Visual Studio 是否也应该创建一个我应该与 test.cpp 链接的 testdllD.lib 文件?如果是这样,我如何让 Visual Studio 同时制作 .dll 和 .lib。

编辑:我是否正确地进行了导入/导出?据我了解,在编译使用 dll 的可执行文件时,您将要使用 dllexport 编译 dll,而将使用 dllimport。

【问题讨论】:

  • 您是否在一个解决方案中拥有 TestDll 项目和 Test 项目?
  • 是的,它们在同一个解决方案中,并且共享同一个输出调试目录。
  • 当两个项目都在一个解决方案中时,您不需要摆弄库路径。您可以设置将为您完成这项工作的项目依赖项。

标签: c++ visual-studio dll dynamic-linking


【解决方案1】:

有几件事需要注意,希望您不要错过。

  1. 你有一个链接错误,意味着你的编译是好的,但是有一个链接错误。该错误表明链接找不到对象文件中引用的 printDLLFuncs() 函数的定义。
  2. 您必须提供在项目目录 -> 库路径中定义函数的 .lib 文件的路径,或者将其放在任何项目文件夹中,以便 Visual Studio 可以找到它。

【讨论】:

  • 当我构建 testdll 时,Visual Studio 似乎没有创建 testdll.lib。有什么方法可以创建这个 .lib 而不会导致我的测试应用程序静态链接到 .lib?
  • 哇!那是一些评论。现在好了,你告诉 Visual Studio 创建它了吗?即使在您告诉您想要一个调用您的函数并且您不喜欢链接错误之后,它也没有创建?我认为您将 Visual Studio 接地一周。你说我的朋友?好吧,开个玩笑,你在建什么样的项目? Win32 DLL项目?您必须在输出目录中有一个与您的 dll 同名的 .lib。请在那里查看。
  • 配置类型:动态库(.dll)输出目录只创建一个.dll,当我告诉它编译.lib(通过将配置更改为“静态库)并指向链接器测试到那个目录,我仍然有同样的未解决的符号错误。
  • @Christopher:创建静态库和动态库以及使用它们的方式是不同的。你能说出你是如何创建这个 DLL 项目的吗?
  • 我创建了一个动态 dll。您对库路径的看法是正确的。它将 .lib 文件输出到另一个位置,一旦我链接到该位置,测试项目就会正确链接并工作。
猜你喜欢
  • 2017-03-06
  • 2013-09-06
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
相关资源
最近更新 更多