首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用link.exe进行静态链接

如何使用link.exe进行静态链接
EN

Stack Overflow用户
提问于 2009-11-07 08:20:19
回答 4查看 17.8K关注 0票数 17

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

我用以下方法构建我的程序:

代码语言:javascript
复制
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错误(“已经定义”):

代码语言:javascript
复制
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:对于查看what's happening
  • /Zl:的结果很有用,因为before
  • /nodefaultlib:libcmt.lib /nodefaultlib:msvcprt.lib:得到了这个错误:

PocoFoundationmt.lib(Exception.obj):warning LNK4217:本地定义的符号??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ (public:__thiscall std::basic_string::~basic_string(Exception.obj))在function __ehhandler$??0Exception@Poco@@QAE@ABV01@@Z

相同的错误

我也尝试了上面的一些组合,但都没有用。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-07 09:42:45

您必须在命令行上定义POCO_STATIC,并同时使用PocoFoundationmt和PocoNetmt.lib进行链接:

代码语言:javascript
复制
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导入库将自动链接。/UPDATE

票数 15
EN

Stack Overflow用户

发布于 2009-11-07 08:22:57

听起来问题在于PocoNet.lib文件是poco.dll的导入库。因此,它解析的外部变量是DLL。

您需要为Poco找到或构建一个静态库(如果可能)。

票数 5
EN

Stack Overflow用户

发布于 2009-11-07 08:40:10

您需要在您的代码及其所有依赖项上使用/MT才能静态链接到MSVC运行时(MSVCP90.dll/MSVCR90.dll)。

这是因为PocoNetmt.lib似乎是用/MT构建的。

如果使用/MT仍然可以获得msvcprt.lib,请打开/verbose并找出其他哪个库在拖拽它。然后重新编译/找到它的静态构建。

另一种选择是找到使用/MD构建的静态PocoNet库(因此可以静态链接到它,但动态链接到运行时),并将所有内容都切换到/MD。

编辑:当Poco dll与/MT链接时,不会影响您。但是,由于您想要摆脱它,您(以及您的所有其他依赖项)将必须使用相同的/MT标志。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1691395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档