1

regexDev-C++ (tdm-gcc 4.7.1) で使用しようとしています。

Boostライブラリをboost.orgからダウンロードして解凍しました

C:\Program Files (x86)\Dev-Cpp\boost

そしてDev-C++で追加されました

C:\Program Files (x86)\Dev-Cpp\boost\libs

ライブラリに。

インクルード パス (C/C++):

C:\Program Files (x86)\Dev-Cpp\boost

main.cpp:

#include <boost/regex.hpp> 
using namespace boost; 
int main()
{
   string s ("some txt PING :665454 some_text");
   smatch mt;
  regex r ("PING :(\\d+) "); // error

    system( "pause" );
    return 0;
}

エラー:

D:\programowanie\dev-c++\main12\main.o  main.cpp:(.text$_ZN5boost9re_detail27cpp_regex_traits_char_layerIcEC2ERKNS0_21cpp_regex_traits_baseIcEE[_ZN5boost9re_detail27cpp_regex_traits_char_layerIcEC2ERKNS0_21cpp_regex_traits_baseIcEE]+0xc3): undefined reference to `boost::re_detail::cpp_regex_traits_char_layer<char>::init()'
D:\programowanie\dev-c++\main12\main.o  main.cpp:(.text$_ZN5boost9re_detail11raw_storage6extendEy[_ZN5boost9re_detail11raw_storage6extendEy]+0x60): undefined reference to `boost::re_detail::raw_storage::resize(unsigned long long)'
c:\program files (x86)\dev-cpp\mingw64\x86_64-w64-mingw32\bin\ld.exe    main12/main.o: bad reloc address 0x60 in section `.text$_ZN5boost9re_detail11raw_storage6extendEy[_ZN5boost9re_detail11raw_storage6extendEy]'
c:\program files (x86)\dev-cpp\mingw64\x86_64-w64-mingw32\bin\ld.exe    final link failed: Invalid operation
D:\programowanie\dev-c++\collect2.exe   [Error] ld returned 1 exit status
4

1 に答える 1

3

Boost からバイナリをダウンロードして、TDM-GCC を正確にターゲットにすることはできなかったと思います。その結果、何があっても、コンパイラ/ツールチェーン間で異なる名前マングリングに関する古典的な問題に遭遇します。Boost バイナリからダウンロードした場合、これらのバイナリは MSVC でビルドされたことが明確に書かれているため、名前マングリング規則が異なるため、TDM-GCC を使用してこれらの Boost ライブラリに直接リンクする際に問題が発生します。

次の 3 つのオプションがあります。

  1. MSVC を使用してプロジェクトをビルドします。
  2. TDM-GCC などの現在のツールチェーンを使用して、自分でソースから Boost ライブラリをビルドします。
  3. 最新のMinGW-w64ツールチェーン (現在 2 つのバリアント)には、Boost ライブラリのビルド - Boost for Windows (最新バージョンは 1.54.0) を使用してください。そのため、バイナリに加えて、MinGW-w64 の対応するツールチェーン バリアント (リンクもあります) をダウンロードし、それを使用してプロジェクトをビルドする必要があります。

    注:名前マングリングは同じであるため (TDM-GCC は MinGW-w64 の単なる派生物であるため)、TDM-GCC を使用して私のバイナリに対してプロジェクトをビルドしてリンクすることはできますが、結果として得られるアプリケーションはバイナリが生成されるとクラッシュする可能性があります。 TDM-GCC のパッチポリシーにより、MinGW-w64 によるバイナリは TDM-GCC と互換性がありません。

最後に、既にコメントで述べたように、Boost ライブラリが見つかるパスを設定するだけでは十分ではありませんが、プロジェクトをリンクするライブラリをコンパイラに明示的に伝える必要もあります。GCC ファミリのコンパイラ (MinGW、MinGW-w64、TDM-GCC) では、-lスイッチを使用して実行されます。そのため、プロジェクトの Dev-C++ でリンカー オプションを指定できる場所を見つけて、-lboost_regex. libboost_regex.aこれは、ライブラリ検索パス (既に指定したもの)からフェッチし、プロジェクトにリンクするようにコンパイラに指示します。

于 2013-10-13T12:13:41.903 に答える