免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: osmanthusgfy
打印 上一主题 下一主题

[C] X86 64平台gcc编译32位的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-26 11:14 |显示全部楼层 |倒序浏览
5可用积分
本帖最后由 osmanthusgfy 于 2011-08-26 11:27 编辑

我想在X86 64平台用gcc编译32位的程序,

Makefile如下:

  1. CFLAGS = $(ARCHFLAGS)
  2. CXXFLAGS = $(ARCHFLAGS)
  3. CPPFLAGS = $(ARCHFLAGS)
  4. LDFLAGS = $(ARCHFLAGS)
  5. OBJCFLAGS = $(ARCHFLAGS)
  6. OBJCXXFLAGS = $(ARCHFLAGS)

  7. CXXFLAGS = -m32 -march=i386 -mtune=i386 -msse2 -O2  -g -Wall -fmessage-length=0

  8. ARCH_FLAGS = -arch i386

  9. OBJS = Obj/Main.o

  10. TARGET = App/aa
  11.        
  12. Obj/Main.o: Src/Main.cc
  13.         $(CXX) $(CXXFLAGS) -c -o Obj/Main.o Src/Main.cc

  14. $(TARGET):        $(OBJS)
  15.         $(CXX) -o  $(TARGET) $(OBJS) $(LDFLAGS) $(LIBS)

  16. all:        $(TARGET)

  17. clean:
  18.         rm -f $(OBJS) $(TARGET)
复制代码
可以编译,但是在链接的时候报错:

  1. ld: warning: in Obj/Main.o, file was built for i386 which is not the architecture being linked (x86_64)
复制代码
请问应该怎么解决?谢谢!!!

论坛徽章:
0
2 [报告]
发表于 2011-08-26 11:41 |显示全部楼层
-arch i386
-march=i386 -mtune=i386
是不是得改改~~
hokuhouhi 发表于 2011-08-26 11:32

要改什么?
-arch i386等同于-march=i386
-mtune=i386 是指定cpu类型的.

论坛徽章:
0
3 [报告]
发表于 2011-08-26 11:42 |显示全部楼层
貌似不同处理器是不同的,你看看吧~~
hokuhouhi 发表于 2011-08-26 11:36


我就是想在64位x86上编译32位的程序.

论坛徽章:
0
4 [报告]
发表于 2011-08-26 12:08 |显示全部楼层
link的时候不要忘记-m32这个参数。
oooooxxxxx 发表于 2011-08-26 11:55

那怎么在Makefile写了?
我试了在生成TARGET时加上-m32不行:

  1. $(TARGET):        $(OBJS)
  2.         $(CXX) -m32 -o  $(TARGET) $(OBJS) $(LIBS)
复制代码
那link时,Makefile到底应该怎么写了?
谢谢!!!

论坛徽章:
0
5 [报告]
发表于 2011-08-26 14:52 |显示全部楼层
你的系统环境,出错信息。另外看看你有没有装32位兼容库。
oooooxxxxx 发表于 2011-08-26 12:28

我系统是Mac OS X,64位的,
出错信息为

  1. ld: warning: in Obj/Main.o, file was built for i386 which is not the architecture being linked (x86_64)
  2. Undefined symbols:
  3.   "_main", referenced from:
  4.       start in crt1.10.6.o
  5. ld: symbol(s) not found
  6. collect2: ld returned 1 exit status
  7. make: *** [App/aa] Error 1
复制代码
系统装有32位兼容库,我用xcode可以编译32位的.

论坛徽章:
0
6 [报告]
发表于 2011-08-26 14:53 |显示全部楼层
help,自己顶!

论坛徽章:
0
7 [报告]
发表于 2011-08-26 15:46 |显示全部楼层
我用file命令查看目标文件:
file ./Obj/Main.o
输出为:
./Obj/Main.o: Mach-0 object i386
证明编译32位的目标文件是成功的,就是链接的时候出错了.
该怎么解决了?!
help!!!

论坛徽章:
0
8 [报告]
发表于 2011-08-27 12:38 |显示全部楼层
这就奇怪了,我在10.6.8上只要gcc -m32 就可以link32位程序的。
oooooxxxxx 发表于 2011-08-27 00:40

我在程序中用到了Mac OS上的framework(  CoreFoundation, CoreServices ) 了,可能是链接的是默认去找64位的framework了,
链接的时候怎样指定32位的framework了?
谢谢!!!

论坛徽章:
0
9 [报告]
发表于 2011-08-27 15:26 |显示全部楼层
结贴,总结:
问题的原因有两个:
1>.链接的时候没有指定-m32参数,这是主要原因;
2>.Makefile本身写的有问题,原因可能是我定义了一些没用到系统变量,把一些默认的值给覆盖了,我删掉那些没用到的变量就OK了

附上修改后的Makefile,并感谢oooooxxxxx大哥热心的帮助!!!(话说大哥的昵称为什么起名叫xxxxxooooo)

  1. CXXFLAGS = -m32 -arch i386 -O2  -g -Wall -fmessage-length=0

  2. OBJS = Obj/Main.o

  3. TARGET = App/aa
  4.         
  5. Obj/Main.o: Src/Main.cc
  6.         $(CXX) $(CXXFLAGS) -c -o Obj/Main.o Src/Main.cc

  7. $(TARGET): $(OBJS)
  8.         $(CXX) -m32 -o  $(TARGET) $(OBJS) $(LDFLAGS) $(LIBS)

  9. all:        $(TARGET)

  10. clean:
  11.         rm -f $(OBJS) $(TARGET)
复制代码

论坛徽章:
0
10 [报告]
发表于 2011-08-29 14:33 |显示全部楼层
这种情况一般把CXX定义为"g++ -m32"而不是放到CXXFLAGS里面
oooooxxxxx 发表于 2011-08-28 01:30



    再次感谢老兄的指点!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP