链接到带有托管组件的静态库

时间:2011-02-16 22:47:23

标签: .net c++ clr

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

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

#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只包含类定义,如上面显示的头文件,减去私有内容。

我正在使用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?

1 个答案:

答案 0 :(得分:4)

静态.lib不是托管代码的有效目标选项。没有实现的机制来获取与托管类型相关联的所有重要元数据与代码相同的处理方式。它不能被分成碎片并再次粘在一起。 MSFT团队可能会考虑它但是被.obj文件格式所需的大量更改吓跑了。这是猜测。一个好的错误信息本来不错。这是事实。

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