8

I have recently decided to use yaml as my configuration file technology, and am writing a c++ linux application on OpenSuse 11.3.

The problem is that even after successfully installing cmake, compilling yaml-cpp as shown on the yaml-cpp docs page, I still can't compile the simple demo programs on the yaml-cpp page here.

For example, when I try to compile the the monster.yaml and main.cpp example

my compiler on issuing the command gcc main.cpp, it issues the following errors:

main.cpp:24:25: error: ‘YAML’ does not name a type
main.cpp:24:35: error: expected unqualified-id before ‘&’ token
main.cpp:24:35: error: expected ‘)’ before ‘&’ token
main.cpp:24:35: error: expected initializer before ‘&’ token
main.cpp:30:25: error: ‘YAML’ does not name a type
main.cpp:30:35: error: expected unqualified-id before ‘&’ token
main.cpp:30:35: error: expected ‘)’ before ‘&’ token
main.cpp:30:35: error: expected initializer before ‘&’ token
main.cpp:35:25: error: ‘YAML’ does not name a type
main.cpp:35:35: error: expected unqualified-id before ‘&’ token
main.cpp:35:35: error: expected ‘)’ before ‘&’ token
main.cpp:35:35: error: expected initializer before ‘&’ token

I tried changing the include directive from #include "yaml-cpp/yaml.h" to #include <yaml.h>, since I'd installed the yaml lib, but this didn't solve anything.

so what did I do wrong?

Here is the problematic code pasted from lines 24 to 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);
   }
}

And here is a dump of the output of the sudo make install after I run the make command:

[ 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

Could there probably be some special directive / option that I have to append to the gcc command when compiling with libyaml? something like gcc main.cpp -libyaml ?

For more output from the compiler (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'

and much more stuff than can fit here , finally ending in:

/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

-- finally --

Solved it with Chris's soln (see below), though I actually found an even cleaner way of pre-loading 'custom' libraries, by using the ldconfig command to configure the library search path after i add the path to my libs into a *.conf file in /etc/ld.so.conf.d/. See the detailed guide here...

1
  • paste code from main.cpp line 24 30 and 35 Commented Apr 17, 2011 at 13:34

2 Answers 2

10

gcc isn't being instructed to look in /usr/local. You need to do it explicitly. Also, that really should be g++ and not gcc. So first make sure your include looks like this:

#include "yaml-cpp/yaml.h"

Then compile it like this:

g++ -I/usr/local/include -L/usr/local/lib -lyaml-cpp -o testprogram main.cpp
Sign up to request clarification or add additional context in comments.

7 Comments

This actually does compile the program properly, BUT when i try to run the executable with ./testprogram, I get the run-time error: ./testprogram: error while loading shared libraries: libyaml-cpp.so.0.2: cannot open shared object file: No such file or directory
$> LD_PRELOAD=/usr/local/lib/libyaml-cpp.so ./testprogram
If the above line works, you'll need to add libyaml-cpp.so's path to your library search path. I don't remember how to do that, you'll need to google that one. The better way is that when you're compiling a program, have it install to /usr and not /usr/local.
Thanks, this solves the run-time error too. The only other issue now seem to be from the monster.yaml format. but with nothing in the file, the errors vanish. I will now test my stuff :-)
@Chris, I actually found an even cleaner way of pre-loading 'custom' libraries, by using the ldconfig command to configure the library search path after i add the path to my libs into a *.conf file in /etc/ld.so.conf.d/
|
0

It looks like it can't find the yaml-cpp headers. First of all, the include directive should be

#include "yaml-cpp/yaml.h"

since, as you can see, the headers are installed to /usr/local/include/yaml-cpp/.

Do you get an error message on the line of the include statement? (Can you post the full compiler output?)

4 Comments

yes, I did run the make and the sudo make install, but still got problems!
I have added the output from the make commands, what do you think is wrong?
there, I've pasted part of the compiler output (it was way too much than i could put here!), but I've only included part of the start and end of this output. Thanks for your concern.
@mcnemesis, so just to clarify: is the first line of the compiler output error: 'YAML' does not name a type? What I'm looking for is, is the compiler happy with the line #include "yaml-cpp/yaml.h"?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.