c++ - 如何使用 link.exe 进行静态链接

标签 c++ static linker visual-c++ poco

我一直在尝试静态链接一个名为 Poco 的 C++ 库。在 Windows 上使用 Visual Studio 2008 命令行工具。

我构建我的程序:

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
    
  • 完全删除 .libas suggested here : 和上面一样的错误

我也尝试了以上的一些组合,都无济于事。

任何线索将不胜感激。但同样有用的是任何指向有助于调试(或了解)这些类型问题的资源的指针。

最佳答案

您必须在命令行上定义 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, "PocoXXXmt.lib") 语句,应该确保所有必要的库都将被链接。

如果您不使用 /DPOCO_STATIC 进行编译,则会自动链接 DLL 导入库。 [/更新]

关于c++ - 如何使用 link.exe 进行静态链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1691395/

相关文章:

C++ 以 utf 8 字符写入 mysql 数据库?

c++ - ZeroMQ Majordomo 工作人员的断言错误

c# - 为什么我的数据在我没有改变的时候却在改变?

c++ - 无法使用来自单独 .cpp 的模板化成员编译/链接类

C++ lambda 在模板的第二次扩展中没有捕获变量?

c++ - WriteFile error #5 "denied access"win Vista/7 下

c - 静态数组分配

c++ - 静态局部对象的构造函数究竟是什么时候调用的?

ios - 链接 SceneKit Framework 避免在 iOS 7 上崩溃

linux - ld链接失败