私は最近、構成ファイル テクノロジとして yaml を使用することに決め、OpenSuse 11.3 で C++ Linux アプリケーションを作成しています。
問題は、cmake を正常にインストールし、yaml-cpp ドキュメント ページに示されているように yaml-cpp をコンパイルした後でも、yaml-cpp ページの簡単なデモ プログラムをコンパイルできないことです。
たとえば、monster.yaml と main.cpp の例をコンパイルしようとすると、
コマンドの発行時にコンパイラがgcc main.cpp
、次のエラーを発行します。
main.cpp:24:25: エラー: 'YAML' はタイプの名前を付けていません
main.cpp:24:35: エラー: '&' の前に unqualified-id が必要です トークン
main.cpp:24:35: エラー: '&' の前に ')' が必要です トークン
main.cpp:24:35: エラー: '&' の前に初期化子が必要です トークン
main.cpp:30:25: エラー: 'YAML' は型 main.cpp:30:35 を指定していません
: エラー: '&' の前に unqualified-id が必要です トークン
main.cpp:30:35: エラー: '&' の前に ')' が必要です トークン
main.cpp:30:35: エラー: '&' の前に初期化子が必要です トークン
main.cpp:35:25: エラー: 'YAML' はタイプ
main.cpp:35:35: エラー: '&' の前に unqualified-id を予期していません トークン
main.cpp:35:35: エラー: '&' の前に ')' が必要です トークン
main.cpp:35:35: エラー: '&' の前に初期化子が必要です トークン
yaml lib をインストールしたので、 include ディレクティブを から に変更しようとしました#include "yaml-cpp/yaml.h"
が、何も解決しませんでした。#include <yaml.h>
それで、私は何を間違えましたか?
24 行目から 40 行目に貼り付けられた問題のあるコードを次に示します。
void operator >> (const YAML::Node& node, Vec3& v) {
node[0] >> v.x;
node[1] >> v.y;
node[2] >> v.z;
}
void operator >> (const YAML::Node& node, Power& power) {
node["name"] >> power.name;
node["damage"] >> power.damage;
}
void operator >> (const YAML::Node& node, Monster& monster) {
node["name"] >> monster.name;
node["position"] >> monster.position;
const YAML::Node& powers = node["powers"];
for(unsigned i=0;i<powers.size();i++) {
Power power;
powers[i] >> power;
monster.powers.push_back(power);
}
}
コマンドsudo make install
を実行した後の出力のダンプを次に示します。make
[ 81%] Built target yaml-cpp
[ 96%] Built target run-tests
[100%] Built target parse
Install the project...
-- Install configuration: "Release"
-- Installing: /usr/local/lib/libyaml-cpp.so.0.2.6
-- Up-to-date: /usr/local/lib/libyaml-cpp.so.0.2
-- Up-to-date: /usr/local/lib/libyaml-cpp.so
-- Up-to-date: /usr/local/include/yaml-cpp/aliasmanager.h
-- Up-to-date: /usr/local/include/yaml-cpp/anchor.h
-- Up-to-date: /usr/local/include/yaml-cpp/conversion.h
-- Up-to-date: /usr/local/include/yaml-cpp/dll.h
-- Up-to-date: /usr/local/include/yaml-cpp/emitfromevents.h
-- Up-to-date: /usr/local/include/yaml-cpp/emitter.h
-- Up-to-date: /usr/local/include/yaml-cpp/emittermanip.h
-- Up-to-date: /usr/local/include/yaml-cpp/eventhandler.h
-- Up-to-date: /usr/local/include/yaml-cpp/exceptions.h
-- Up-to-date: /usr/local/include/yaml-cpp/iterator.h
-- Up-to-date: /usr/local/include/yaml-cpp/ltnode.h
-- Up-to-date: /usr/local/include/yaml-cpp/mark.h
-- Up-to-date: /usr/local/include/yaml-cpp/node.h
-- Up-to-date: /usr/local/include/yaml-cpp/nodeimpl.h
-- Up-to-date: /usr/local/include/yaml-cpp/nodereadimpl.h
-- Up-to-date: /usr/local/include/yaml-cpp/nodeutil.h
-- Up-to-date: /usr/local/include/yaml-cpp/noncopyable.h
-- Up-to-date: /usr/local/include/yaml-cpp/null.h
-- Up-to-date: /usr/local/include/yaml-cpp/ostream.h
-- Up-to-date: /usr/local/include/yaml-cpp/parser.h
-- Up-to-date: /usr/local/include/yaml-cpp/stlemitter.h
-- Up-to-date: /usr/local/include/yaml-cpp/stlnode.h
-- Up-to-date: /usr/local/include/yaml-cpp/traits.h
-- Up-to-date: /usr/local/include/yaml-cpp/yaml.h
-- Up-to-date: /usr/local/include/yaml-cpp/anchordict.h
-- Up-to-date: /usr/local/include/yaml-cpp/graphbuilder.h
-- Installing: /usr/local/lib/pkgconfig/yaml-cpp.pc
gcc
libyamlでコンパイルするときに、コマンドに追加する必要がある特別なディレクティブ/オプションがおそらくあるでしょうか? みたいなgcc main.cpp -libyaml
?
コンパイラからの詳細な出力については ( gcc version 4.5.0 20100604 [gcc-4_5-branch revision 160292] (SUSE Linux)
) :
/tmp/ccYltArL.o: In function `operator>>(YAML::Node const&, Monster&)':
main.cpp:(.text+0x1a8): undefined reference to `YAML::Node::size() const'
/tmp/ccYltArL.o: In function `main':
main.cpp:(.text+0x1fe): undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(char const*, std::_Ios_Openmode)'
main.cpp:(.text+0x215): undefined reference to `YAML::Parser::Parser(std::basic_istream<char, std::char_traits<char> >&)'
main.cpp:(.text+0x224): undefined reference to `YAML::Node::Node()'
main.cpp:(.text+0x23e): undefined reference to `YAML::Parser::GetNextDocument(YAML::Node&)'
main.cpp:(.text+0x29c): undefined reference to `std::cout'
ここに収まるよりもはるかに多くのもので 、最終的には次のようになります。
/tmp/ccYltArL.o:(.rodata._ZTIN4YAML14BadDereferenceE[typeinfo for YAML::BadDereference]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
/tmp/ccYltArL.o:(.rodata._ZTIN4YAML11KeyNotFoundE[typeinfo for YAML::KeyNotFound]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
/tmp/ccYltArL.o:(.rodata._ZTIN4YAML13InvalidScalarE[typeinfo for YAML::InvalidScalar]+0x0): more undefined references to `vtable for __cxxabiv1::__si_class_type_info' follow
/tmp/ccYltArL.o:(.rodata._ZTIN4YAML9ExceptionE[typeinfo for YAML::Exception]+0x8): undefined reference to `typeinfo for std::runtime_error'
/tmp/ccYltArL.o:(.eh_frame+0x18f): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
- 最後に -
ldconfig
Chrisのsoln (以下を参照) で解決し*.conf
ましたが、実際には、「カスタム」ライブラリをプリロードするさらにクリーンな方法を見つけました/etc/ld.so.conf.d/
。詳細なガイドはこちらをご覧ください...