Using TinyXML (Linking Libraries in C ++)
+ Hi ... I'm a newbie ... and I don't know how to include external libraries in C ++. It's difficult.
I want to use TinyXML. so i did this:
example2.cpp
#include <iostream>
#include "tinyxml.h"
void write_app_settings_doc( )
{
TiXmlDocument doc;
TiXmlElement* msg;
TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "", "" );
doc.LinkEndChild( decl );
TiXmlElement * root = new TiXmlElement( "MyApp" );
doc.LinkEndChild( root );
TiXmlComment * comment = new TiXmlComment();
comment->SetValue(" Settings for MyApp " );
root->LinkEndChild( comment );
TiXmlElement * msgs = new TiXmlElement( "Messages" );
root->LinkEndChild( msgs );
msg = new TiXmlElement( "Welcome" );
msg->LinkEndChild( new TiXmlText( "Welcome to MyApp" ));
msgs->LinkEndChild( msg );
msg = new TiXmlElement( "Farewell" );
msg->LinkEndChild( new TiXmlText( "Thank you for using MyApp" ));
msgs->LinkEndChild( msg );
TiXmlElement * windows = new TiXmlElement( "Windows" );
root->LinkEndChild( windows );
TiXmlElement * window;
window = new TiXmlElement( "Window" );
windows->LinkEndChild( window );
window->SetAttribute("name", "MainFrame");
window->SetAttribute("x", 5);
window->SetAttribute("y", 15);
window->SetAttribute("w", 400);
window->SetAttribute("h", 250);
TiXmlElement * cxn = new TiXmlElement( "Connection" );
root->LinkEndChild( cxn );
cxn->SetAttribute("ip", "192.168.0.1");
cxn->SetDoubleAttribute("timeout", 123.456); // floating point attrib
doc.SaveFile( "appsettings.xml" );
}
int main()
{
write_app_settings_doc( );
return 0;
}
just an example file. So when I compile this with:
g ++ example2.cpp
i the following error message appears:
/tmp/cc6npUsW.o: In function `write_app_settings_doc()':
example2.cpp:(.text+0x13): undefined reference to `TiXmlDocument::TiXmlDocument()'
example2.cpp:(.text+0x43): undefined reference to `TiXmlDeclaration::TiXmlDeclaration(char const*, char const*, char const*)'
example2.cpp:(.text+0x58): undefined reference to `TiXmlNode::LinkEndChild(TiXmlNode*)'
example2.cpp:(.text+0x8f): undefined reference to `TiXmlElement::TiXmlElement(char const*)'
example2.cpp:(.text+0xa4): undefined reference to `TiXmlNode::LinkEndChild(TiXmlNode*)'
example2.cpp:(.text+0x112): undefined reference to `TiXmlNode::LinkEndChild(TiXmlNode*)'
example2.cpp:(.text+0x132): undefined reference to `TiXmlElement::TiXmlElement(char const*)'
example2.cpp:(.text+0x147): undefined reference to `TiXmlNode::LinkEndChild(TiXmlNode*)'
example2.cpp:(.text+0x17e): undefined reference to `TiXmlElement::TiXmlElement(char const*)'
example2.cpp:(.text+0x1cb): undefined reference to `TiXmlNode::LinkEndChild(TiXmlNode*)'
example2.cpp:(.text+0x1f4): undefined reference to `TiXmlNode::LinkEndChild(TiXmlNode*)'
example2.cpp:(.text+0x214): undefined reference to `TiXmlElement::TiXmlElement(char const*)'
example2.cpp:(.text+0x261): undefined reference to `TiXmlNode::LinkEndChild(TiXmlNode*)'
example2.cpp:(.text+0x28a): undefined reference to `TiXmlNode::LinkEndChild(TiXmlNode*)'
example2.cpp:(.text+0x2aa): undefined reference to `TiXmlElement::TiXmlElement(char const*)'
example2.cpp:(.text+0x2bf): undefined reference to `TiXmlNode::LinkEndChild(TiXmlNode*)'
example2.cpp:(.text+0x2f6): undefined reference to `TiXmlElement::TiXmlElement(char const*)'
example2.cpp:(.text+0x30b): undefined reference to `TiXmlNode::LinkEndChild(TiXmlNode*)'
example2.cpp:(.text+0x33d): undefined reference to `TiXmlElement::SetAttribute(char const*, char const*)'
example2.cpp:(.text+0x358): undefined reference to `TiXmlElement::SetAttribute(char const*, int)'
example2.cpp:(.text+0x373): undefined reference to `TiXmlElement::SetAttribute(char const*, int)'
example2.cpp:(.text+0x38e): undefined reference to `TiXmlElement::SetAttribute(char const*, int)'
example2.cpp:(.text+0x3a9): undefined reference to `TiXmlElement::SetAttribute(char const*, int)'
example2.cpp:(.text+0x3c9): undefined reference to `TiXmlElement::TiXmlElement(char const*)'
example2.cpp:(.text+0x3de): undefined reference to `TiXmlNode::LinkEndChild(TiXmlNode*)'
example2.cpp:(.text+0x40d): undefined reference to `TiXmlElement::SetAttribute(char const*, char const*)'
example2.cpp:(.text+0x42a): undefined reference to `TiXmlElement::SetDoubleAttribute(char const*, double)'
example2.cpp:(.text+0x43d): undefined reference to `TiXmlDocument::SaveFile(char const*) const'
/tmp/cc6npUsW.o: In function `TiXmlString::operator=(char const*)':
example2.cpp:(.text._ZN11TiXmlStringaSEPKc[TiXmlString::operator=(char const*)]+0x23): undefined reference to `TiXmlString::assign(char const*, unsigned int)'
/tmp/cc6npUsW.o: In function `TiXmlString::quit()':
example2.cpp:(.text._ZN11TiXmlString4quitEv[TiXmlString::quit()]+0xc): undefined reference to `TiXmlString::nullrep_'
/tmp/cc6npUsW.o: In function `TiXmlComment::TiXmlComment()':
example2.cpp:(.text._ZN12TiXmlCommentC1Ev[TiXmlComment::TiXmlComment()]+0x15): undefined reference to `TiXmlNode::TiXmlNode(TiXmlNode::NodeType)'
example2.cpp:(.text._ZN12TiXmlCommentC1Ev[TiXmlComment::TiXmlComment()]+0x1e): undefined reference to `vtable for TiXmlComment'
/tmp/cc6npUsW.o: In function `TiXmlText::TiXmlText(char const*)':
example2.cpp:(.text._ZN9TiXmlTextC1EPKc[TiXmlText::TiXmlText(char const*)]+0x17): undefined reference to `TiXmlNode::TiXmlNode(TiXmlNode::NodeType)'
example2.cpp:(.text._ZN9TiXmlTextC1EPKc[TiXmlText::TiXmlText(char const*)]+0x20): undefined reference to `vtable for TiXmlText'
example2.cpp:(.text._ZN9TiXmlTextC1EPKc[TiXmlText::TiXmlText(char const*)]+0x4f): undefined reference to `TiXmlNode::~TiXmlNode()'
/tmp/cc6npUsW.o: In function `TiXmlDocument::~TiXmlDocument()':
example2.cpp:(.text._ZN13TiXmlDocumentD1Ev[TiXmlDocument::~TiXmlDocument()]+0xb): undefined reference to `vtable for TiXmlDocument'
example2.cpp:(.text._ZN13TiXmlDocumentD1Ev[TiXmlDocument::~TiXmlDocument()]+0x24): undefined reference to `TiXmlNode::~TiXmlNode()'
collect2: ld returned 1 exit status
I am mainly a Java developer and I have a lot of problems in C ++ for using external libraries. I don't know when to call. when to include. when should i do -I / myincludepath /
these files are in the same folder:
example.cpp tinyxml.h tinyxml.cpp tinystr.h tinystr.cpp
Can anyone help me?
a source to share
First, none of them are libraries:
example.cpp tinyxml.h tinyxml.cpp tinystr.h tinystr.cpp
You need to find the tinyxml library. This location should be documented in the package's documentation, but let's say it's in / foo (it won't) and called libtinyxml.a (it probably won't). You can link it like this:
g++ example2.cpp -L/foo -ltinyxml
which adds / foo to the link path and looks for libtinyxml.a on it. Or you can just provide the full path to the library:
g++ example2.cpp /foo/libtinyxml.a
Why aren't you trying to learn about Make? It's actually very simple. Each line starting at column 0 is a target with its preconditions. The line starting with a tab describes one step in building a target. For instance:
example2: example2.cpp example2.h
g++ example2.cpp tinyxml.cpp tinystr.cpp -oexample2
Or, if you have a library:
example2: example2.cpp example2.h
g++ example2.cpp -Ltinyxml -oexample2
You don't actually need to specify the compiler you are using. Perhaps you are using one here and the other the other. This way you can use the corresponding make variable:
example2: example2.cpp example2.h
$(CXX) example2.cpp -Ltinyxml -oexample2
What is it. Save this as a file called "Makefile" and to compile your project just type:
$ make
And it will compile it if needed. Further reading:
http://www.gnu.org/software/make/manual/html_node/index.html
a source to share