0

Boost の「program_options」サポートを使用して小さな C++ プログラムを作成しています。次のコード:

boost::program_options::options_description desc("Allowed options");
desc.add_options()
    (".refreshrate", boost::program_options::value< int >()->default_value(50), "Delay between frames")
    (".location",    boost::program_options::value<std::string>(&__Location), "Camera Location")
    (".address",     boost::program_options::value<std::string>(&__Address), "Address of Camera")
    ;
boost::program_options::variables_map vm;
boost::program_options::store(boost::program_options::parse_config_file(ifile, desc, true), vm);
boost::program_options::notify(vm);

コンパイルはしますが、リンクしません。次のような不可解なリンク エラーが発生します。

CXX 実行可能メインのリンク アーキテクチャ x86_64 の未定義シンボル: "boost::program_options::validation_error::what() const"、参照先: vtable for boost::program_options::invalid_option_value in IEEE1394_Camera.cxx.o vtable for boost::exception_detail ::clone_impl > IEEE1394_Camera.cxx.o 内の boost::exception_detail::error_info_injector の vtable IEEE1394_Camera.cxx.o で "boost::program_options::validation_error::validation_error(boost::program_options::validation_error::kind_t, std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)"、参照元: std::basic_string, std::allocator > const& boost::program_options::validators::get_single_string(std::vector, std::allocator >, std::allocator, std::allocator > > > const&, bool) in IEEE1394_Camera.cxx .o (たぶん、boost::program_options::validation_error::validation_error(boost::program_options::validation_error::kind_t, std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&, int)) ld: アーキテクチャ x86_64 collect2 のシンボルが見つかりません: エラー: ld が 1 つの終了ステータスを返しましたprogram_options::validation_error::kind_t, std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&, int)) ld: アーキテクチャ x86_64 collect2 のシンボルが見つかりません: エラー: ld は 1 つの終了ステータスを返しましたprogram_options::validation_error::kind_t, std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&, int)) ld: アーキテクチャ x86_64 collect2 のシンボルが見つかりません: エラー: ld は 1 つの終了ステータスを返しました

ただし、「.refreshrate」オプションを削除するか、int ではなく std::string に変更するだけで修正されます。

私は CMake でコンパイルしており、Boost 1.49 と Boost 1.5 (自分でコンパイル) を試しました。Boost を darwin (デフォルト) と gcc ツールチェーンの両方と組み合わせ、組み込みの gcc4.2 とインストールされた Macports 4.7 を使用しました。運がない。

何か案は?

更新:これが私の完全なリンクコマンドです(「make VERBOSE = 1」から):

"/Applications/CMake 2.8-8.app/Contents/bin/cmake" -E cmake_link_script CMakeFiles/main.dir/link.txt --verbose=1 /opt/local/bin/g++-mp-4.7 -Wl,- search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/main.dir/main.cxx.o -o main /Users/rhand/Development/boost-1.50/install/lib/libboost_program_options.a /Users/rhand/Development/boost-1.50/install /lib/libboost_timer.a /Users/rhand/Development/boost-1.50/install/lib/libboost_chrono.a /Users/rhand/Development/boost-1.50/install/lib/libboost_system.a /Users/rhand/Development/boost -1.50/install/lib/libboost_exception.a

4

1 に答える 1

3

詳細についてはまだ少し曖昧ですが、わかりました。

すべてを一掃し、XCode から在庫の gcc4.2 に戻り、次のコマンドを使用して Boost を再構築しました。

./b2 --prefix=/Users/rhand/Development/boost-1.50/install/ --layout=versioned --build-type=complete variant=release link=shared runtime-link=shared threading=single install

次に、CMake ビルドを適切にリンクするためにいくつか変更する必要がありました。

set(Boost_COMPILER "-xgcc42")

いくつかの環境変数を設定します。

BOOSTROOT=/Users/rhand/Development/boost-1.50/install/
BOOST_INCLUDEDIR=/Users/rhand/Development/boost-1.50/install/include/boost-1_50/
BOOST_LIBRARYDIR=/Users/rhand/Development/boost-1.50/install/lib

そして、すべてが機能します。リリースビルドを指定するか、すべての共有ライブラリを使用する際に特別なものでない限り、問題が何であったかは正確にはわかりません...

于 2012-08-16T02:37:31.817 に答える