18

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たが、何も変わらないようです。私のアプリにはまだPocoDLLが必要です。(これ/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に、完全にドロップします:上記と同じエラー

私はまた、上記のいくつかの組み合わせを試しましたが、まったく役に立ちませんでした。

手がかりがあれば大歓迎です。しかし、これらのタイプの問題をデバッグ(または学習)するのに役立つリソースへのポインターも同様に役立ちます。

4

4 に答える 4

15

コマンド ラインで 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 インポート ライブラリが自動的にリンクされます。[/アップデート]

于 2009-11-07T01:42:44.673 に答える
5

問題は、PocoNet.libファイルがpoco.dllのインポートライブラリであるということのようです。したがって、解決される外部はDLLに対するものです。

Pocoの静的ライブラリを検索または構築する必要があります(可能な場合)。

于 2009-11-07T00:22:56.797 に答える
0

POCO >= 1.4.0は、静的ランタイムで静的をサポートします(動的ランタイムでは引き続き静的)

https://raw.github.com/pocoproject/poco/poco-1.4.5/CHANGELOG (「debug_static_mt」で検索)

pocoヘッダーを含めるときは、 POCO_STATICを定義することを忘れないでください

于 2012-11-21T16:02:29.000 に答える
0

MSVC ランタイム (MSVCP90.dll/MSVCR90.dll) に静的にリンクするには、コードとそのすべての依存関係に /MT が必要です。

これは、PocoNetmt.lib が /MT でビルドされているように見えるためです。

/MT を使用しても msvcprt.lib が表示される場合は、/verbose をオンにして、他のどのライブラリがそれをドラッグしているかを調べます。次に、その静的ビルドを再コンパイル/検索します。

別のオプションは、/MD でビルドされた静的な PocoNet ライブラリを見つけて (静的にリンクしますが、ランタイムに動的にリンクします)、すべてを /MD に切り替えることです。

編集:Poco dllが/ MTにリンクされている場合、影響はありません。しかし、それを取り除きたいので、あなた (および他のすべての依存関係) は同じ /MT フラグを使用する必要があります。

于 2009-11-07T00:40:09.513 に答える