2015-04-15 141 views
0

我的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 $< 
+0

除其他事項外,除非你的源文件使用的是C++語言(類,迭代器,STL電話,等等等等),那麼你應該使用gcc而不是G ++實際寫入。否則所有的編譯器調用應該是g ++。注意:make文件缺少某些項目,如每個源文件的本地頭文件依賴項。 (LDIL)$(LDFLAGS)$(OFILES)-Llibrarypath -llibrrayshortnames -o $(PROGRAM)編譯步驟應該是這樣的:%.o:%。 c然後 $(CC)$(CFLAGS)-c $ <-o $ @ -I $(INCPATH) – user3629249

+0

是否有編譯* .s文件的規則? – user3629249

+0

你的代碼在開始時已經很糟糕。將它保持原樣將會使未來的維護成爲可怕的痛苦。指針不應該作爲整數存儲,在需要的情況下應該總是存儲在'intptr_t'或'uintptr_t' –

回答

3

你沒有輸入連接器(G ++)的彙編代碼是32位指令。

嘗試:

CPP= gcc -E -m32 
CC = g++ -m32 
LD = g++ 
AS = as --32 
+0

如果你的意思是添加到LD = g ++ -m elf_i386,那麼它給了我這個「/ usr/lib/gcc/x86_64-redhat-linux/4.4.7 /../../../../ lib64/crt1.o:無法讀取符號:文件格式錯誤「 – TonyLic

+0

非常感謝。這樣可行。 – TonyLic

+0

如果你知道你的回答是錯誤的,刪除它而不是編輯爲你的錯誤道歉 – Raedwald