为我的个人小应用程序创建GUI后,我尝试将其编译为静态库以供其他项目使用.通过当前仅具有5个功能但将添加到其中的托管公共引用类,创建了GUI并执行了其他任务.
这是我在静态库中的头文件,该头文件将包含在另一个项目中(嗯,至少一个只有公共功能的新文件,所有多余的东西都将被删除);
#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?
解决方法:
静态.lib不是托管代码的有效目标选项.没有实现机制可以使与托管类型关联的所有重要元数据获得与代码相同的待遇.不能将它切成碎片再粘在一起. MSFT团队可能考虑了这一点,但对.obj文件格式所需的大量更改感到恐惧.那是个猜测.一个好的错误消息会很好.这是事实.
您必须选择一个DLL作为目标.在运行时,JIT编译器执行与链接器相同的功能,它仅从客户端实际使用的DLL程序集中提取代码.