C++ 32位代码在64位linux机器上运行

C++ 32位代码在64位linux机器上运行,c++,c,linux,makefile,32bit-64bit,C++,C,Linux,Makefile,32bit 64bit,我的linux是64位Red Hat 6.5。通用条款为4.4.7。我有一个最初在32位机器上运行的代码,这意味着,从指针到int有很多转换。当我进行转换时,我得到错误:从'void*'转换为'int'会失去精度。我知道这是因为在64位操作系统中,指针类型是8字节 我不想一个接一个地修复所有这些问题,因为太多了,所以我在makefile CFLGAS中添加了-m32标志,默认情况下,它使32位代码在为64位对象配置的编译器上运行 好消息是这个编译错误消失了。然而,编译器给了我这个main.o:无

我的linux是64位Red Hat 6.5。通用条款为4.4.7。我有一个最初在32位机器上运行的代码,这意味着,从指针到int有很多转换。当我进行转换时,我得到
错误:从'void*'转换为'int'会失去精度
。我知道这是因为在64位操作系统中,指针类型是8字节

我不想一个接一个地修复所有这些问题,因为太多了,所以我在makefile CFLGAS中添加了
-m32
标志,默认情况下,它使32位代码在为64位对象配置的编译器上运行

好消息是这个编译错误消失了。然而,编译器给了我这个
main.o:无法读取错误格式的符号:文件
。看起来这仍然是32位和64位之间的兼容问题。谁能告诉我怎么解决这个问题吗

这是我的makefile.common的一部分,用于gmake:

CFLAGS = -m32 -g -Wall -Wshadow $(INCPATH) $(DEFINES) $(HOST) -DCHANGED 
LDFLAGS = -m32

CPP= gcc -E -m32
CC = g++
LD = g++
AS = as --32
.......
S_OFILES = switch.o

OFILES = $(C_OFILES) $(S_OFILES)

$(PROGRAM): $(OFILES)
    $(LD) $(OFILES) $(LDFLAGS) -o $(PROGRAM)

$(C_OFILES): %.o:
    $(CC) $(CFLAGS) -c $<
CFLAGS=-m32-g-Wall-Wshadow$(INCPATH)$(DEFINES)$(HOST)-DCHANGED
LDFLAGS=-m32
CPP=gcc-E-m32
CC=g++
LD=g++
AS=AS--32
.......
S_of iles=开关
OFILES=$(C_OFILES)$(S_OFILES)
$(程序):$(文件)
$(LD)$(文件)$(LDFLAGS)-o$(程序)
美元(市盈率):%
$(CC)$(CFLAGS)-c$<

您没有输入链接器(g++),即汇编代码是32位指令

尝试:


您没有输入链接器(g++),说明汇编代码是32位指令

尝试:


您没有输入链接器(g++),说明汇编代码是32位指令

尝试:


您没有输入链接器(g++),说明汇编代码是32位指令

尝试:



如果你的意思是添加到LD=g++-melf_i386,那么它给了我这个“/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../../../../../../../../lib64/crt1.o:无法读取错误格式的符号:文件”如果你知道你的答案是错误的,删除它而不是编辑它来为你的错误道歉如果你的意思是添加到LD=g++-melf u i386,那么它给了我这个“/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../../../../../../lib64/crt1.o:无法读取符号:文件格式错误”如果您知道您的答案是错误的,请删除它,而不是编辑它来为您的错误道歉如果您的意思是添加到LD=g++-m elf_i386,那么它给了我这个”/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../../../../../../lib64/crt1.o:无法读取符号:文件格式错误“如果您知道您的答案是错误的,请删除它,而不是编辑它以道歉您的错误如果您的意思是添加到LD=g++-m elf_i386,那么它给了我这个”/UR/LB/GCC/X86Y6HORTH-Linux/4.4.7//../…/LIb64/CRT1.O:不能读取符号:错误格式的文件“如果您知道您的答案是错误的,删除它而不是编辑以对您的错误进行道歉,除非您的源文件实际上是用C++语言编写的(类、迭代器、STL调用等))然后应该使用gcc而不是g++。否则,所有编译器调用都应该是g++。注意:make文件缺少某些项,例如每个源文件的本地头文件依赖项。链接器按照给定的顺序获取/处理参数。..so$(LD)$(LDFLAGS)$(OFILES)-Llibrarypath-llibrrayshortnames-o$(程序)编译步骤应该类似于:%.o:%.c然后$(CC)$(CFLAGS)-c$<-o$@-I$(INCPATH)有没有编译*.s文件的规则?你的代码一开始就已经很糟糕了。保持原样会让以后的维护变得非常痛苦。指针不应该存储为int,并且在需要的情况下,应该始终存储在
intptr\t
uintptr\t
等文件中,除非你的源文件实际上是写的使用C++语言(类、迭代器、STL调用等),则应该使用GCC而不是G++。否则所有编译器调用都应该是G++。注意:make文件缺少某些项,比如每个源文件的本地头文件依赖关系。链接器按给定的顺序来处理/处理参数。$(OFILES)-Llibrarypath-llibrrayshortnames-o$(程序)编译步骤应该类似于:%.o:%.c然后$(CC)$(CFLAGS)-c$<-o$@-I$(INCPATH)有没有编译*.s文件的规则?你的代码一开始就已经很糟糕了。保持原样会让以后的维护变得非常痛苦。指针不应该存储为int,并且在需要的情况下,应该始终存储在
intptr\t
uintptr\t
等文件中,除非你的源文件实际上是写的使用C++语言(类、迭代器、STL调用等),则应该使用GCC而不是G++。否则所有编译器调用都应该是G++。注意:make文件缺少某些项,比如每个源文件的本地头文件依赖关系。链接器按给定的顺序来处理/处理参数。$(OFILES)-Llibrarypath-llibrrayshortnames-o$(程序)编译步骤应该类似于:%.o:%.c然后$(CC)$(CFLAGS)-c$<-o$@-I$(INCPATH)有没有编译*.s文件的规则?你的代码一开始就已经很糟糕了。保持原样会让以后的维护变得非常痛苦。指针不应该存储为int,并且在需要的情况下,应该始终存储在
intptr\t
uintptr\t
等文件中,除非你的源文件实际上是写的使用C++语言(类、迭代器、STL调用等),则应该使用GCC而不是G++。否则所有编译器调用都应该是G++。注意:make文件缺少某些项,比如每个源文件的本地头文件依赖关系。链接器按给定的顺序来处理/处理参数。$(OFILES)-Llibrarypath-LLIBrayShortNames-o$(程序)编译步骤应该类似于:%.o:%.c然后$(CC)$(CFLAGS)-c$<-o$@-I$(INCPATH)是否有编译*.s文件的规则?您的代码一开始就已经很糟糕。保持原样会使未来的维护变得非常痛苦。指针
CPP= gcc -E -m32
CC = g++ -m32
LD = g++ 
AS = as --32