Search code examples
c++osx-maverickslinker-errorstinyxml

Linking Errors tinyxml on OS X 10.9.2


I would like to use tinyxml. I have used it in the past, and it works great. The only problem is I was developing on my Linux box which is a laptop. I have a mac mini and I have that set up as my desktop, so I would like to use it for a big chunk of development.

I have a simple tinyxml example that one of my instructors gave me. With this example came a Makefile like so:

ifeq ("$(shell whoami)", "malloy")
  CXX = clang++
else
  CXX = g++
endif

# Warnings frequently signal eventual errors:
CXXFLAGS=`sdl-config --cflags` -g -W -Wall -Weffc++ -Wextra -pedantic -O0

ifeq ("$(shell uname)", "Darwin")
  LDFLAGS = -framework Foundation -framework GLUT -framework OpenGL -lm
else
  ifeq ("$(shell uname)", "Linux")
  LDFLAGS = `sdl-config --libs` -lm -lSDL_ttf -lSDL_image -ltinyxml
  endif
endif

OBJS = \
    main.o
EXEC = run

%.o: %.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

$(EXEC): $(OBJS)
    $(CXX) $(CXXFLAGS) -o $@ $(OBJS) $(LDFLAGS)

main.o: main.cpp

clean:
    rm -rf $(OBJS)
    rm -rf $(EXEC)

And when I try to make this simple project I get all of these Undefined symbol errors. This is what terminal outputs after I type make:

g++ `sdl-config --cflags` -g -W -Wall -Weffc++ -Wextra -pedantic -O0 -o run main.o -   framework Foundation -framework GLUT -framework OpenGL -lm
Undefined symbols for architecture x86_64:
"TiXmlString::nullrep_", referenced from:
  TiXmlString::quit() in main.o
"TiXmlDocument::LoadFile(TiXmlEncoding)", referenced from:
  _main in main.o
"TiXmlDocument::TiXmlDocument(char const*)", referenced from:
  _main in main.o
"TiXmlNode::Clear()", referenced from:
  _main in main.o
"TiXmlNode::~TiXmlNode()", referenced from:
  TiXmlDocument::~TiXmlDocument() in main.o
"TiXmlElement::Attribute(char const*) const", referenced from:
  _main in main.o
"TiXmlNode::FirstChildElement() const", referenced from:
  TiXmlNode::FirstChildElement() in main.o
"TiXmlNode::NextSiblingElement() const", referenced from:
  TiXmlNode::NextSiblingElement() in main.o
"vtable for TiXmlDocument", referenced from:
  TiXmlDocument::~TiXmlDocument() in main.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [run] Error 1

I know it is a linker error that is about it. I used Homebrew to install tinyxml. It was actually giving me problems so after I got the tar-ball for tinyxml I extracted it and put the folder in /usr/local/include. g++ doesn't complain about finding the files. Just stuff with the v-table.

Any help is greatly appreciated! Thanks in advance!!!


Solution

  • You should modify the makefile and instruct the linker to use tinyxml (-ltinyxml) in the "Darwin" case. AFAIK, tinyxml is not bundled with OSX so you may need to find or build that. Instead, you can use expat (simpler-easier) or libxml2 (faster-detailed), which already come with OSX (you can also use (c++) wrappers, google them...)