如何使用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