9
votes

I've been working on a c++ project for a while now, but would like to port it over to my arm processor. I already have all of my cross-compile tools (I'm using CodeSourcery) and thought I could just change my makefile to point to that compiler. It compiles fine using the default g++, but When try a make pointing to the cross-compiler I get relocation errors:

/home/oryan/CodeSourcery/bin/../lib/gcc/arm-none-linux-gnueabi/4.5.2/../../../../arm-none-linux-gnueabi/bin/ld: ServerSocket.o: Relocations in generic ELF (EM: 3)
ServerSocket.o: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
make: *** [simple_server] Error 1

It seems like I don't have a proper link set up or it's pointing to a wrong location. I'm not that familiar with makefiles and am probably missing something obvious. The makefile I've been using is from http://tldp.org/LDP/LG/issue74/tougher.html with the client side removed:

# Makefile for the socket programming example
#

simple_server_objects = ServerSocket.o Socket.o simple_server_main.o

all : simple_server

simple_server: $(simple_server_objects)
         /home/matt/CodeSourcery/bin/arm-none-linux-gnueabi-g++ -o simple_server $(simple_server_objects)


Socket: Socket.cpp
ServerSocket: ServerSocket.cpp
simple_server_main: simple_server_main.cpp

clean:
        rm -f *.o simple_server

Right now I am manually compiling each file and it works great, but I'd like to further my understanding here.

Thanks!

2

2 Answers

9
votes

The problem is you've set your makefile up to link with the new g++ but you haven't changed the compiler you're using to build the objects in the first place.

The easiest way to fix this is to set environment CXX to the next compiler, i.e.

export CXX=/home/matt/CodeSourcery/bin/arm-none-linux-gnueabi-g++

or just set it for a given make by adding CXX=... to the command line.

You'll need to make clean first but you'll then use the correct compiler for both the compile and link.

You could also specify a new how-to-compile-C++ files rule in your makefile to specify the new compiler but the environment variable is easier:

.cc.o:
        /home/.../g++ $(CPPFLAGS) $(CXXFLAGS) -c
1
votes

The problem is because of these three rules:

Socket: Socket.cpp
ServerSocket: ServerSocket.cpp
simple_server_main: simple_server_main.cpp

First of all, the left-hand side of the rule should be the object file I guess, so should have the .o suffix.

The second problem, and most likely the root of your problem, is that there is no command to compile the source files, which means that make will use the default compiler and not your cross-compiler.