Кросс-компиляция проекта C ++, Перемещение в универсальном ELF (EM: 3) - PullRequest
8 голосов
/ 17 ноября 2011

Я уже некоторое время работаю над проектом на c ++, но хотел бы перенести его на мой процессор руки. У меня уже есть все мои инструменты для кросс-компиляции (я использую CodeSourcery) и подумал, что могу просто изменить свой make-файл, чтобы он указывал на этот компилятор. Он прекрасно компилируется с использованием g ++ по умолчанию, но при попытке сделать make, указывающей на кросс-компилятор, я получаю ошибки перемещения:

/ дома / Oryan / CodeSourcery / бен /../ Библиотека / GCC / арм-ни-линукс-gnueabi / 4.5.2 /../../../../ рычажного ни-линукс-gnueabi / bin / ld: ServerSocket.o: перемещения в общем ELF (EM: 3)
ServerSocket.o: не удалось прочитать символы: файл в неправильном формате
collect2: ld вернул 1 статус выхода
make: *** [simple_server] Ошибка 1

Похоже, у меня не установлена ​​правильная ссылка или она указывает на неправильное местоположение. Я не очень знаком с make-файлами и, вероятно, упускаю что-то очевидное. Я использую make-файл из http://tldp.org/LDP/LG/issue74/tougher.html с удаленной клиентской стороной:

# 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

Прямо сейчас я вручную компилирую каждый файл, и он прекрасно работает, но я хотел бы углубить мое понимание здесь.

Спасибо!

Ответы [ 2 ]

9 голосов
/ 17 ноября 2011

Проблема в том, что вы настроили свой make-файл так, чтобы он связывался с новым g ++, но вы не изменили компилятор, который вы используете для создания объектов.

Самый простой способисправить это, чтобы установить окружение CXX для следующего компилятора, то есть

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

или просто установить его для заданного make, добавив CXX=... в командную строку.

Сначала вам нужно будет make clean, но затем вы будете использовать правильный компилятор как для компиляции, так и для ссылки.

Вы также можете указать новое правило для файлов для компиляции C ++ в вашем make-файле, чтобыукажите новый компилятор, но переменная среды проще:

.cc.o:
        /home/.../g++ $(CPPFLAGS) $(CXXFLAGS) -c
1 голос
/ 17 ноября 2011

Проблема из-за этих трех правил:

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

Прежде всего, левая часть правила должна быть объектным файлом, я думаю, поэтому должен иметь суффикс .o.

Вторая проблема, и, скорее всего, корень вашей проблемы, заключается в том, что нет команды для компиляции исходных файлов, что означает, что make будет использовать компилятор по умолчанию, а не ваш кросс-компилятор.

...