代码之家  ›  专栏  ›  技术社区  ›  xyzzyrz

如何使用link.exe静态链接

  •  17
  • xyzzyrz  · 技术社区  · 16 年前

    我一直试图静态链接到一个C++库 Poco 在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
      
    • .lib 总共 as suggested here :与上述错误相同

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

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

    4 回复  |  直到 9 年前
        1
  •  15
  •   Govind Parmar vitaly.v.ch    7 年前

    您必须在命令行上定义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_静态 ,则DLL导入库将自动链接。 [/更新]

        2
  •  5
  •   Michael Burr    16 年前

    听起来问题在于 PocoNet.lib 文件是poco.dll的导入库。所以它解析的外部是DLL。

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

        3
  •  0
  •   Eugene    16 年前

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

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

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

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

    编辑: 其他

        4
  •  0
  •   franckspike    13 年前

    POCO>=1.4.0支持 静态运行时

    https://raw.github.com/pocoproject/poco/poco-1.4.5/CHANGELOG

    包括poco头时