gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:20:19 25 4
gpt4 key购买 nike

在为我的个人小应用程序创建了一个 GUI 之后,我试图将它编译为一个静态库以用于另一个项目。 GUI 已创建并通过一个托管的公共(public) ref 类执行其他任务,该类目前只有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com