我的linux是64位Red Hat 6.5。 GCC是4.4.7。我有一個最初在32位機器上運行的代碼,這意味着有很多從指針到int的轉換。當我製作時,我得到error: cast from ‘void*’ to ‘int’ loses precision
。我知道這是因爲在64位OS指針類型是8字節。32位代碼在64位Linux機器上運行
我不想一一解決所有這一切,因爲太多了,所以我在生成文件CFLGAS中添加了-m32
標誌,這使32位代碼在默認情況下運行在爲64位對象配置的編譯器上。
好的是這個編譯錯誤消失了。不過,編譯器給我這個main.o: could not read symbols: File in wrong format
。似乎這仍然是32位和64位之間的一些兼容問題。誰能告訴我如何解決這個問題?
這是用於使用gmake我makefile.common的一部分:
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 $<
除其他事項外,除非你的源文件使用的是C++語言(類,迭代器,STL電話,等等等等),那麼你應該使用gcc而不是G ++實際寫入。否則所有的編譯器調用應該是g ++。注意:make文件缺少某些項目,如每個源文件的本地頭文件依賴項。 (LDIL)$(LDFLAGS)$(OFILES)-Llibrarypath -llibrrayshortnames -o $(PROGRAM)編譯步驟應該是這樣的:%.o:%。 c然後 $(CC)$(CFLAGS)-c $ <-o $ @ -I $(INCPATH) –
user3629249
是否有編譯* .s文件的規則? – user3629249
你的代碼在開始時已經很糟糕。將它保持原樣將會使未來的維護成爲可怕的痛苦。指針不應該作爲整數存儲,在需要的情況下應該總是存儲在'intptr_t'或'uintptr_t' –