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