【发布时间】:2010-12-14 01:35:22
【问题描述】:
我一直在尝试使用 Visual Studio 2008 命令行工具在 Windows 上静态链接一个名为 Poco 的 C++ 库。
我构建我的程序:
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错误(“已经定义”):
msvcprt.lib(MSVCP90.dll) : error LNK2005: "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)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) already defined in exp.obj
然后我尝试堆叠更多标志:
/verbose:lib:有助于查看正在发生的事情/Zl: 结果和之前一样-
/nodefaultlib:libcmt.lib /nodefaultlib:msvcprt.lib: 收到此错误: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 完全删除
.lib,as suggested here:与上述相同的错误
我也尝试了以上的一些组合,都无济于事。
任何线索将不胜感激。但同样有用的是任何指向有助于调试(或了解)这些类型问题的资源的指针。
【问题讨论】:
标签: c++ static linker visual-c++ poco