如何使用link.exe静态链接 我一直试图用VisualStudio 2008命令行工具来与Windows上的C++库静态链接。
我通过以下方式构建我的程序:如何使用link.exe静态链接 我一直试图用VisualStudio 2008命令行工具来与Windows上的C++库静态链接。,c++,static,linker,visual-c++,poco,C++,Static,Linker,Visual C++,Poco,我通过以下方式构建我的程序: cl /I..\poco\lib /c myapp.cpp link /libpath:..\poco\lib myapp.obj PocoNet.lib 这将导致在运行时需要PocoNet.dll和PocoFoundation.dll的exe 我花了一些时间阅读Windows中的链接,了解到cl/MT静态链接标准库,而cl/MD动态链接 我试图指定/MT,但这似乎没有改变任何事情;我的应用程序仍然需要Poco DLL。(我还怀疑/MT是默认行为。) 查看。\po
cl /I..\poco\lib /c myapp.cpp
link /libpath:..\poco\lib myapp.obj PocoNet.lib
这将导致在运行时需要PocoNet.dll和PocoFoundation.dll的exe
我花了一些时间阅读Windows中的链接,了解到cl/MT
静态链接标准库,而cl/MD
动态链接
我试图指定/MT
,但这似乎没有改变任何事情;我的应用程序仍然需要Poco DLL。(我还怀疑/MT
是默认行为。)
查看。\poco\lib
,我发现还有一个PocoNetmt.lib,但指定它而不是PocoNet.lib会导致一系列LNK2005错误(“已定义”):
.lib
:与上述错误相同任何线索都将不胜感激。但是,指向对调试(或了解)这些类型的问题有用的资源的指针也同样有用。听起来问题在于
PocoNet.lib
文件是poco.dll的导入库。所以它解析的外部是DLL
您需要为Poco查找或构建一个静态库(如果可能)。您的代码及其所有依赖项需要/MT以静态链接到MSVC运行时(MSVCP90.dll/MSVCR90.dll) 这是因为PocoNetmt.lib似乎是用/MT构建的 如果使用/MT仍然可以获得msvcprt.lib,请打开/verbose并找出是哪个库拖动它。然后重新编译/找到它的静态构建 另一个选项是查找使用/MD构建的静态PocoNet库(因此静态链接到它,但动态链接到运行时),并将所有内容切换到/MD 编辑:
当Poco dll链接到不影响您的/MT时。但是,由于您想摆脱它,您(以及所有其他依赖项)必须使用相同的/MT标志。您必须在命令行上定义POCO_STATIC,并与PocoFoundationmt和PocoNetmt.lib链接:
C:\test>cl /MD /WX /nologo /EHsc /DPOCO_STATIC /DUNICODE /D_UNICODE /I..\poco\Foundation\include /I ..\poco\Net\include /c exp.cpp
exp.cpp
C:\test>link /libpath:..\poco\lib /WX /nologo exp.obj PocoNetmt.lib PocoFoundationmt.lib
[更新]
如果使用/DPOCO_STATIC
编译,则无需在链接器命令行上指定POCO库。头文件包含#pragma comment(lib,“pocoxxmt.lib”)
语句,这些语句应确保所有必要的库都链接到其中
如果不使用/DPOCO\u STATIC
编译,则DLL导入库将自动链接。
[/UPDATE]POCO>=1.4.0支持静态运行时静态运行时(动态运行时仍然静态) (搜索“调试\u静态\u mt”)
当包含POCO头文件时,不要忘记定义POCO_STATIC,但如何验证?我提到我最终找到并切换到了一个
PocoNetmt.lib
;这就是开始给我链接错误的原因。(Poco构建系统默认生成共享和静态libs。)我刚从Poco邮件列表中得到一个响应,告诉我,虽然PocoNetmt.lib确实用于静态链接,但Poco libs本身都是用/MT构建的,因此我仍然需要与标准运行时libs动态链接——这很好。我只是不想拖拽随身携带的PocoNet.dll,这就是我不知道该怎么做的。/MT意味着你不链接到运行时dll/MD的意思是你知道。这个标志在你链接到的所有库中必须是相同的。啊,很抱歉。我知道这一点,我想写“都是用/MD构建的。”谢谢。POCO_静态是关键。我强烈建议在高级文档和自述中突出这一晦涩难懂的咒语。谷歌搜索POCO_STATIC时,对它的唯一引用是在博客文章中。
PocoFoundationmt.lib(Exception.obj) : warning LNK4217: locally defined symbol ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ (public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)) imported in function __ehhandler$??0Exception@Poco@@QAE@ABV01@@Z
C:\test>cl /MD /WX /nologo /EHsc /DPOCO_STATIC /DUNICODE /D_UNICODE /I..\poco\Foundation\include /I ..\poco\Net\include /c exp.cpp
exp.cpp
C:\test>link /libpath:..\poco\lib /WX /nologo exp.obj PocoNetmt.lib PocoFoundationmt.lib