主题 : linux交叉编译问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 78082
精华: 0
发帖: 35
金钱: 180 两
威望: 36 点
综合积分: 70 分
注册时间: 2012-09-15
最后登录: 2014-04-11
楼主  发表于: 2013-04-28 23:50

 linux交叉编译问题

这是XML的

这是原来Makefile的
simple_quoter_server: $(simple_quoter_server_objects)
        g++ -L/usr/local/lib -I/usr/local/include \
        -o sqs $(simple_quoter_server_objects) \
        -lexpat -lpthread

改成交叉编译
simple_quoter_server: $(simple_quoter_server_objects)
        arm-linux-gcc-4.4.3 -L/usr/local/lib -I/usr/local/include \
        -o sqs $(simple_quoter_server_objects) \
        -lexpat -lpthread

make 后出现错吴
simple_quoter_server.o: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
make: *** [simple_quoter_server] Error 1

file信息
# file simple_quoter_server.o
simple_quoter_server.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

小白求解答
级别: 荣誉会员
UID: 34761
精华: 0
发帖: 1348
金钱: 6835 两
威望: 1367 点
综合积分: 2696 分
注册时间: 2010-12-21
最后登录: 2017-06-02
1楼  发表于: 2013-04-29 16:09
先make  clean一下,可能目录下还留有x86的.o文件
级别: 新手上路
UID: 78082
精华: 0
发帖: 35
金钱: 180 两
威望: 36 点
综合积分: 70 分
注册时间: 2012-09-15
最后登录: 2014-04-11
2楼  发表于: 2013-04-29 18:20

 回 1楼(hacker) 的帖子

试了,我确定没有 .o文件 除非有隐藏的
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
3楼  发表于: 2013-04-30 10:42
simple_quoter_server: $(simple_quoter_server_objects)
        arm-linux-gcc-4.4.3 -L/usr/local/lib -I/usr/local/include \
        -o sqs $(simple_quoter_server_objects) \
        -lexpat -lpthread

这只是说明sqs执行档是用交叉编译器链接生成的,但用来链接的object文件($(simple_quoter_server_objects)所指向的内容)还是按照原来的规则编译的。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 78082
精华: 0
发帖: 35
金钱: 180 两
威望: 36 点
综合积分: 70 分
注册时间: 2012-09-15
最后登录: 2014-04-11
4楼  发表于: 2013-04-30 13:46

 回 3楼(kasim) 的帖子

好高深, 是不是Makefile文件哪里写错了?
你看下
# Makefile for XML stuff


all : simple_quoter_server simple_quoter_client

xmlrpc_objects = reply.o request.o server.o client.o \
    node.o socket.o server_socket.o client_socket.o

base64_objects = b64.o

simple_quoter_server_objects = simple_quoter_server.o \
                               $(xmlrpc_objects) \
                               $(base64_objects)

simple_quoter_client_objects = simple_quoter_client.o \
                               $(xmlrpc_objects) \
                               $(base64_objects)


CXXFLAGS= -g -I/usr/local/include


simple_quoter_server: $(simple_quoter_server_objects)
    arm-linux-gcc -L/usr/local/lib -I/usr/local/include \
    -o sqs $(simple_quoter_server_objects) \
    -lexpat -lpthread

simple_quoter_client: $(simple_quoter_client_objects)
    arm-linux-gcc -L/usr/local/lib -I/usr/local/include \
    -o sqc $(simple_quoter_client_objects) \
    -lexpat -lpthread


simple_quoter_server.o : simple_quoter_server.cpp
simple_quoter_client.o : simple_quoter_client.cpp
reply.o : reply.cpp
request.o : request.cpp
node.o : node.cpp
socket.o : socket.cpp
server_socket.o : server_socket.cpp
client_socket.o : client_socket.cpp
b64.o : b64.c


clean :
    rm -f *.o sqs sqc
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
5楼  发表于: 2013-04-30 15:17
看起来你需要
1. 在Makefile里加上"CXX=arm-linux-gcc-4.4.3"和"LD=$(CXX)"用来指定默认的编译器和链接器;
2. 用"LDFLAGS=-L <交叉编译器安装路径里的lib目录>"来指定链接时搜索共享库的路径
3. 把“CXXFLAGS= -g -I/usr/local/include”里的路径改成你交叉编译器安装路径里的include目录;
4. 把Makefile里g++用$(LD)代替,"-L /usr/local/lib"用$(LDFLAGS)代替;

另外,注意根据

-lexpat -lpthread

你需要ARM版本的libexpat.so和libpthread.so。 通常它们包含在交叉编译器的安装包里,如果没有的话,你需要自己预先交叉编译好并且安装到交叉编译器的安装路径里。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 83648
精华: 0
发帖: 9
金钱: 55 两
威望: 11 点
综合积分: 18 分
注册时间: 2012-12-10
最后登录: 2013-05-19
6楼  发表于: 2013-04-30 15:49
#CXXFLAGS= -g -I/home/work/toolschain/4.4.3/include

simple_quoter_server: $(simple_quoter_server_objects)
        arm-linux-gcc -L/home/work/toolschain/4.4.3/lib \
        -I/home/work/toolschain/4.4.3/include\
        -o sqs $(simple_quoter_server_objects) \
        -lexpat -lpthread

simple_quoter_client: $(simple_quoter_client_objects)
        arm-linux-gcc -L/home/work/toolschain/4.4.3/lib \
        -I/home/work/toolschain/4.4.3/include\
        -o sqc $(simple_quoter_client_objects) \
        -lexpat -lpthread

我改成这样可以么?
级别: 新手上路
UID: 78082
精华: 0
发帖: 35
金钱: 180 两
威望: 36 点
综合积分: 70 分
注册时间: 2012-09-15
最后登录: 2014-04-11
7楼  发表于: 2013-04-30 17:00

 回 5楼(kasim) 的帖子

Makefile没深入写过,能不能帮忙改下。

交叉编译器路径:/share/opt/FriendlyARM/toolschain/4.4.3
级别: 新手上路
UID: 78082
精华: 0
发帖: 35
金钱: 180 两
威望: 36 点
综合积分: 70 分
注册时间: 2012-09-15
最后登录: 2014-04-11
8楼  发表于: 2013-04-30 18:23

 回 5楼(kasim) 的帖子

谢谢,问题已经解决了