.net - 使用托管组件链接到静态库

标签 .net c++ clr

为我的个人小应用程序创建 GUI 后,我尝试将其编译为静态库以在另一个项目中使用。 GUI 已创建,并通过托管公共(public)引用类执行其他任务,该类当前只有 5 个函数,但将添加到其中。

这是我在静态库中的头文件,它将包含在另一个项目中(好吧,至少是一个只有公共(public)函数的新头文件,所有额外的东西都会被删除);

#ifndef GUIInterface_H
#define GUIInterface_H
#include 
#include "MainForm.h"

using namespace System;
using namespace System::Threading;

 public ref class GUIInterface
{
private:
    ThreadStart^ GUIThreadDelegate;
    Thread^ GUIThread;
    void GUIThreadFunction()
    {
        ANNGUI::Application::EnableVisualStyles();
        ANNGUI::Application::Run(gcnew ANNGUI::MainForm());
        return;
    }

public:
    int CreateGUI();

    int DestroyGUI();

    int GetInputData();

    bool CheckNewInput();

    int NetworkState();
};
#endif

这是从其他项目 (.exe) 访问它的方式

#include "main.h"

int main()
{
    GUIInterface ^GUI = gcnew(GUIInterface);
    GUI->CreateGUI();
    return 0;
}

main.h 仅包含类定义(如上面所示的头文件),减去私有(private)内容。

我正在使用 Visual Studio 2010 Express C++。这两个项目都是使用/clr 开关编译的。静态库被设置为 .exe 项目中的引用。当我将静态库编译为 DLL 时,程序运行完美(在我删除应用程序中的 main.h 之后)。当它被编译为静态库时,用于与 GUI 通信的每个函数都会出现 LNK2020 错误。

我将 .exe 与/VERBOSE 选项链接起来以查看输出。链接器多次精确地查找 .lib 所在的位置,但从未说过它找到了它,即使它正在精确地查找正确的路径和正确的文件。另外,如果这意味着什么的话,我的 .lib 构建得很好,但将此作为警告。

.NETFramework,Version=v4.0.AssemblyAttributes.obj : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library

我的问题是,为什么链接器在正确的位置寻找 .lib,却没有在它的面前看到它?我该如何解决这个问题以便我可以使用我的静态.lib?

最佳答案

静态 .lib 不是托管代码的有效目标选项。没有实现的机制可以使与托管类型关联的最重要的元数据得到与代码相同的处理。它不能被分割成碎片并再次粘合在一起。 MSFT 团队可能考虑过这一点,但被 .obj 文件格式所需的巨大更改吓跑了。这是一个猜测。如果有一个好的错误消息就好了。这是事实。

您必须选择一个 DLL 作为目标。在运行时,JIT编译器执行与链接器相同的功能,它只从客户端实际使用的DLL程序集中提取代码。

关于.net - 使用托管组件链接到静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5023137/

相关文章:

.net - 32 位 CPU 上的 Int64 实现

c# - DataGrid 具有 WPF 中第 n 级单元格的 DataGrid

.net - 远程部署到 .NET Box

c# - 如何防止 WCF 服务进入故障状态?

c++ - 不使用 gcnew 创建 C++/CLI 对象

c++ - 我如何决定是否为新的 C++ 项目使用 ATL、MFC、Win32 或 CLR?

c# - 针对 C# 中自己的库的数学库

c++ - 我应该通过传递冗余参数来避免隐式行为吗?

c++ - 编译器会根据我处理未引用参数的方式执行不同的操作吗?

c++ - 在 C++ 中验证控制台输入