我一直在研究一个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
现在我手动编译每个文件并且效果很好,但我想在这里进一步理解。
谢谢!
答案 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
将使用默认编译器,而不是交叉编译器。