【问题标题】:C++ Linker Error (Unresolved External) when linking to /clr DLL链接到 /clr DLL 时出现 C++ 链接器错误(未解决的外部)
【发布时间】:2013-04-11 14:17:37
【问题描述】:

我有一个打开 /clr 选项的 DLL。我的 DLL 中有以下声明:

int __declspec(dllexport) __cdecl  test();

另外,我有一个带有 /clr 选项的控制台。并在我的 main.cpp 文件中有以下声明:

int __declspec(dllimport) __cdecl  test();

我在控制台应用程序的属性设置中添加了对 DLL 项目的引用。但是我仍然从编译器那里得到关于测试功能的未解决的外部问题。

我设法通过手动添加对编译器生成的 lib 文件的引用来进行编译。但后来我无法在 DLL 函数内打断点(它说源代码与原始版本不同或符号尚未加载...)

有人可以帮我吗?

【问题讨论】:

  • 您是否真的在任何地方定义了test()(而不是仅仅声明它)?你真的可以链接到旧版本的库吗?
  • 是的,我确实在 cpp 文件中定义了测试。我怀疑我是否链接到旧版本的 lib,因为即使我清理了整个解决方案,问题仍然存在。
  • 对不起,我看错了你的问题。 DLL 是否真正被管理(即您可以简单地删除 /clr 选项)吗?
  • 我在遇到同样的问题时发现了这个问题。我的情况可能和你一样,也可能不一样。无论如何,我需要的解决方案可能会帮助你。这是我的场景:我在一个大型遗留系统(10 多个 EXE,50 多个 DLL)上工作——所有这些系统都是用 C++ 编写的,直到大约 2005 年,当我们开始将一些部分迁移到 C# 时,使用 C++/CLR 作为互操作。现在,如果我可以简单地检查我所有的 C++ 代码并将编译器选项设置为 /CLR、修复错误并发布 C# 和 C++/CLR 的混合 - 没有留下任何“纯”非托管代码,那就太好了。
  • 如果可行,我可以迁移 C++/CLR 实现以利用 .NET 框架。我可以将托管 (CLR) 接口添加到 DLL。最终,我什至可以用 C# 替换 C++/CLR 代码(更容易处理)。但它不起作用。

标签: c++ dll linker clr


【解决方案1】:

如果您的 DLL 不使用任何托管功能,只需从该项目中删除 /clr 选项并重新编译。如果仍然出现错误,则可能与控制台应用程序中的引用有关。

如果 DLL 使用托管功能,您需要的是这样的:

DLL

#include "stdafx.h"

namespace Test1
{
    public ref class Test2
    {
        public:
            static int test()
            {
                return 1;
            }
    };
}

控制台应用

#include <iostream>

int main(int argc, char* argv[])
{
    int i = Test1::Test2::test();        
    std::cout << i << std::endl;
    return 0;

}

【讨论】:

  • 我的 DLL 有一些托管类和一些非托管类。现在我无法将我的非托管类移植到托管类。我在很多情况下都使用这个 DLL。当我将此库与非托管控制台应用程序链接时,我得到了那些链接器错误(除非我手动链接到生成的 lib 文件,但调试时我无法进入 lib)。当我使用托管控制台尝试此库时,它可以正常工作...
  • @DaniloCarvalho 我有点困惑。因此,您遇到问题的控制台应用程序是非托管的,但您正在使用 /clr 标志编译它?您确定用#pragma unmanaged#pragma managed(push, off) 将相关方法标记为非托管吗?无论如何,您应该能够进行链接,但如何进行取决于具体情况(是的,您可能需要手动添加 .lib 文件)。
  • 不,我没有那样做。为什么我需要这样做?编译器不能通过查看 __declspec(dllexport) 部分知道该方法是非托管的吗?
  • @DaniloCarvalho 抱歉,我不清楚。 “有问题的方法”是指名义上的非托管方法,它试图在使用/clr 选项编译的控制台应用程序中调用test()。但是,我不认为用__declspec(dllexport) 声明函数足以使其不受管理,但这可能取决于编译器版本?
猜你喜欢
  • 1970-01-01
  • 2012-03-05
  • 2012-01-15
  • 1970-01-01
  • 2015-11-14
  • 2020-04-30
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多