4

私のシステムで Debian Wheezy と g++4.7 を使用してプログラムをコンパイルしようとしています。Debian Squeeze を使用して別のシステムで実行できるようにしたい (最近の g++ は使用しない)。Squeeze でプログラムをコンパイルできません。これはC++11、新しい Boost バージョンと libcrypto++9 だけでなく、古い g++ がサポートしていない特定の機能を使用しているためです。

私が理解している限り、この問題を回避する通常の方法は、他のシステムでサポートされていないライブラリを静的にリンクすることlibstdcです。boostcrypto++

私の(リンク)コンパイラ呼び出しは今

g++-4.7 .obj/btcmirco.o -Wl,-Bstatic -lboost_program_options -lboost_system -lcrypto++ -Wl,-Bdynamic -lcurl -static-libgcc -std=c++11 -o MyProgram

ただし、未定義の参照エラーが多数スローされるため、何かを見逃しているようです。に動的リンクするとcrypto++(そして静的リンクのみ)、正常に動作libstdcboostます。

何が間違っているのか、または私のアプローチに根本的な誤りがあるかどうかを誰かに教えてもらえますか?

私が得るリンカエラーは(短縮)です:

`.text._ZN8CryptoPP22BufferedTransformationD2Ev' referenced in section `.text._ZN8CryptoPP22BufferedTransformationD1Ev[_ZN8CryptoPP22BufferedTransformationD1Ev]' of /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libcrypto++.a(cryptlib.o): defined in discarded section `.text._ZN8CryptoPP22BufferedTransformationD2Ev[_ZN8CryptoPP22BufferedTransformationD5Ev]' of /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libcrypto++.a(cryptlib.o)
`.text._ZN8CryptoPP25MessageAuthenticationCodeD2Ev' referenced in section `.text._ZN8CryptoPP25MessageAuthenticationCodeD1Ev[_ZN8CryptoPP25MessageAuthenticationCodeD1Ev]' of /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libcrypto++.a(cryptlib.o): defined in discarded section `.text._ZN8CryptoPP25MessageAuthenticationCodeD2Ev[_ZN8CryptoPP25MessageAuthenticationCodeD5Ev]' of /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libcrypto++.a(cryptlib.o)
4

1 に答える 1

3

私は同じ問題を経験しましたが、これは、g++-4.7 (プログラム) によって生成されたコードと以前のバージョンの g++ (cryptopp ライブラリ) によって生成されたコードを混在させようとしているという事実に関係しています。

この背後にある理由は、ライブラリ実行makeコマンドをコンパイルするg++と、システムのデフォルト バージョンのセットアップ (通常は OS に付属するバージョン) が使用されるためです。

この問題を解決するには、cryptoppライブラリをでコンパイルする必要がありますg++-4.7。そのためには、 を実行してライブラリをコンパイルしますmake CXX=g++-4.7。結果の静的ライブラリは、コードにリンクされているときにエラーを表示しないはずです。

于 2014-01-16T06:04:08.760 に答える