2017-10-24 11 views
0

非常にシンプルなコード魔法使いが、ファイルが存在するかどうかを確認するためにLibboostファイルシステムを利用しています。また、静的ライブラリではなく、libboostをdllライブラリとして使用したいと考えています。ここでは、私は数分前に書かれたものを持っている:私は、リンカ設定から-lboost_filesystemを削除して、Eclipseの設定でグローバルマクロBOOST_FILESYSTEM_DYN_LINKを追加するとき[C++] [cygwin] [gcc] BOOST_FILESYSTEM_DYN_LINK経由でDLLからファイルシステムをブーストする

void Hex2bin::convert(string filename, vector<uint8_t>* decodedBytes) { 
const path fname(filename); // from boost::filesystem 

if (exists(fname)) { 
    ; 
} 
else { 
    throw new EFileDoesntExist; 
} 

} 

は、残念ながら、私は以下のようにのみ、このようなリンカエラーを取得:

は/ usr/include/boost/filesystem/operations.hpp:446: `boost :: filesystem :: detail :: status(boost :: filesystem :: path const &、boost :: system :: error_code *)への未定義参照 '

ソースファイルは警告なしでコンパイルされます。 -lboost_filesystemに戻っても問題ないですが、ライブラリが静的にEXEファイルにリンクされていると仮定します。何が間違っているのか誰にも分かりますか?あるいは、私はlibboostをどのようにリンクさせることができないのか間違っているのでしょうか?

答えて

0

いいえライブラリがスタティックライブラリではなく共有オブジェクトであっても、-lboost_filesystemを指定する必要があります。実際には、ほとんどのリンカーは、両方とも存在する場合には.aではなく共有オブジェクトに対してリンクすることを好むと、を好んでいます(必要に応じてこれを変更する方法があります)。

lddを使用すると、実行可能ファイルがリンクされている共有ライブラリが表示されます。

+0

こんにちは。あなたが正しいです。私はちょうど私のexeでlddをチェックし、ライブラリはdllからリンクされています:) –

0

Windows(特にMSVC++)のみがBoostとの「自動リンク」をサポートしています。 Linuxではlibboost_filesystem.soまたはlibboost_filesystem.aにリンクしていますが、どちらの場合でも明示的にリンクする必要があります。

+0

しかし、あなたは '-lboost_filesystem'と両方をリンクし、リンカーはそれが見つかるものを使います。 –

+0

迅速な回答ありがとうございます。私はWindows 7 x64の下でCygwin64を使用していますが、Martin Bonner氏の回答によれば問題は解決しているようです –

関連する問題