Linker error but only when using plain makefile instead of cmake
Closed this issue · 1 comments
Mad5ci commented
I'm trying to simplify the build process by sidestepping cmake for applications.
I successfully built shark and installed it.
I am able to build my application if I use cmake; but I want to do it directly with a simple makefile.
I get the following link error:
undefined reference to `shark::csvStringToData(shark::Data<remora::vector<double, remora::cpu_tag> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char, char, unsigned long)'
What is cmake doing that my simple makefile is not??
This (with cmake) works:
madscientist@dc3ml2:~/Projects/ARML/restml/cpp-predictor$ cat CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
# This project is designed to be built outside the Shark source tree.
# set Shark_DIR to the proper location
project(predictor)
# Find the Shark libraries and includes
find_package(Shark REQUIRED)
include(${SHARK_USE_FILE})
# Executable
add_executable(predictor predictor.cpp mlmodel.cpp)
target_link_libraries(predictor ${SHARK_LIBRARIES})
This with a simple makefile does not:
madscientist@dc3ml2:~/Projects/ARML/restml/cpp-predictor$ cat __makefile
CXX = g++
CXXFLAGS = -O3
target: predictor.o mlmodel.o
$(CXX) $(CXXFLAGS) -o predictor predictor.o mlmodel.o -L/usr/local/lib/libshark.a -lboost_serialization
predictor.o: predictor.cpp mlmodel.hpp
$(CXX) $(CXXFLAGS) -c predictor.cpp
mlmodel.o: mlmodel.cpp
$(CXX) $(CXXFLAGS) -c mlmodel.cpp
clean:
rm -f *.o
What is cmake doing that my makefile is not doing?
I get this result with my makefile:
madscientist@dc3ml2:~/Projects/ARML/restml/cpp-predictor$ make
g++ -O3 -c predictor.cpp
g++ -O3 -c mlmodel.cpp
g++ -O3 -o predictor predictor.o mlmodel.o -L/usr/local/lib/libshark.a -lboost_serialization
mlmodel.o: In function `LongRunningPredictor::mlmodel::predictFromData(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
mlmodel.cpp:(.text+0x342): undefined reference to `shark::csvStringToData(shark::Data<remora::vector<double, remora::cpu_tag> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char, char, unsigned long)'
collect2: error: ld returned 1 exit status
makefile:5: recipe for target 'target' failed
make: *** [target] Error 1
Thanks!
_M
Mad5ci commented
I found the solution... minor tweak/misunderstanding in my link recipe. I had to dig through all of the cmake automgical stuff to figure out what it was doing differently (HATE that cmake is so opaque!) The following works:
target: predictor.o mlmodel.o
$(CXX) $(CXXFLAGS) -o predictor predictor.o mlmodel.o /usr/local/lib/libshark.a -L/usr/local/lib/ -lboost_serialization