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

时间:2011-11-17 14:40:21

标签: c++ makefile cross-compiling

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

  

/家庭/ oryan / CodeSourcery的/ bin中/../ LIB / GCC /臂-NONE-Linux的gnueabi / 4.5.2 /../../../../臂-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

现在我手动编译每个文件并且效果很好,但我想在这里进一步理解。

谢谢!

2 个答案:

答案 0 :(得分:9)

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

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

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

或只是通过在命令行中添加make为给定的CXX=...设置它。

您首先需要make clean,但您将使用正确的编译器进行编译和链接。

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

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

答案 1 :(得分:1)

问题在于这三条规则:

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

首先,规则的左侧应该是我猜的目标文件,因此应该有.o后缀。

第二个问题,也就是问题的根源,是没有编译源文件的命令,这意味着make将使用默认编译器,而不是交叉编译器。