交叉编译C++项目,通用ELF中的重定位(EM:3)

Mat*_*att 8 c++ makefile cross-compiling

我一直在研究一个c ++项目,但是想把它移植到我的arm处理器上.我已经拥有了所有的交叉编译工具(我正在使用CodeSourcery)并认为我可以将makefile更改为指向该编译器.它使用默认的g ++编译很好,但是当尝试指向交叉编译器的make时,我得到重定位错误:

/home/oryan/CodeSourcery/bin/../lib/gcc/arm-none-linux-gnueabi/4.5.2/../../../../arm-none-linux-gnueabi/bin/ ld:ServerSocket.o:通用ELF(EM:3)
ServerSocket.o中的重定位:无法读取符号:文件格式错误
collect2:ld返回1退出状态
make:***[simple_server]错误1

似乎我没有设置正确的链接或者它指向错误的位置.我对makefile并不熟悉,可能会遗漏一些明显的东西.我一直在使用的makefile来自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
Run Code Online (Sandbox Code Playgroud)

现在我手动编译每个文件,它工作得很好,但我想在这里进一步理解.

谢谢!

Rup*_*Rup 9

问题是你已经将你的makefile设置为与新的g ++链接,但是你没有改变你用来构建对象的编译器.

解决此问题的最简单方法是将环境设置CXX为下一个编译器,即

export CXX=/home/matt/CodeSourcery/bin/arm-none-linux-gnueabi-g++
Run Code Online (Sandbox Code Playgroud)

或者只需make通过添加CXX=...到命令行将其设置为给定.

您make clean首先需要,但是您将为编译和链接使用正确的编译器.

您还可以在makefile中指定新的how-to-compile-C++文件规则来指定新的编译器,但环境变量更容易:

.cc.o:
        /home/.../g++ $(CPPFLAGS) $(CXXFLAGS) -c
Run Code Online (Sandbox Code Playgroud)