gcc64位編譯
Ⅰ x86-64上怎麼安裝GCC,編譯32位和64位程序,謝謝。
如果大多數類unix系統應當是自帶gcc的 編譯程序時使用不同的參數就可以選擇編譯成64位或者32位. 如果要求性能,推薦使用icc
Ⅱ 64位UBUNTU 下 如何用GCC 編譯出32位程序 求前輩指點
目測是32位的搜索路徑下沒有sys/cdefs.h
一般64位系統最好不要安裝32位庫的-dev,經常有沖突,強行安裝會破壞64位環境,頭文件並不像共享庫分得那麼完美。
我覺得比較好的做法是,重新把某一個文件夾當成rootfs,在裡面安裝各種32位的庫和庫-dev,然後給gcc傳遞參數"--sysroot=路徑"就可以讓gcc重新選取那個文件夾為rootfs,而不再認為/為rootfs。其實這樣就變成交叉編譯了。也可以在這個rootfs中安裝32位的必要軟體包如bash,gcc,coreutils等等,然後chroot進去就變成host編譯了。其實有個比較簡單的方法,就是虛擬機下安一個32位的ubuntu,然後裝好各種軟體包,然後直接對/打包,再拿出來解壓就是rootfs了,後面最多就是缺啥安啥,工作量比較小。當然如果你不在意編譯速度,直接虛擬機下編最簡單
Ⅲ 64位gcc編譯浮點加法為什麼每次mov指令都執行兩次
這個,你需要先查一下x86_64傳遞參數的規則。浮點數是用 xmm0, xmm1,xmm2,xmm3來傳遞參數的。
你還需要了解一下SIMD指令集。
http://en.wikipedia.org/wiki/X86_calling_conventions
我不知道為什麼你反匯編出來是這樣。我自己測試了一下,反匯編結果比你的簡單多了。
你的編譯器,可能規則和我的稍有不同。比我的復雜一些。
大概翻譯如下:
0x00000000004014f0<+0>:push%rbp
0x00000000004014f1<+1>:sub$0x4,%rsp
0x00000000004014f5<+5>:lea0x80(%rsp),%rbp
0x00000000004014fd<+13>:movss%xmm0,-0x6c(%rbp)====>參數s保存在xmm0中,把它壓到棧上位置為-0x6c(%rbp)
0x0000000000401502<+18>:movss-0x6c(%rbp),%xmm0====>xmm0可以保存4個float,這樣,僅僅把-0x6c(%rbp)位置的一個floats傳遞到xmm0寄存器,准備做float的運算
0x0000000000401507<+23>:addss%xmm0,%xmm0====>2個float相加,相加結果保存在xmm0中
0x000000000040150b<+27>:movss%xmm0,-0x80(%rbp)==>把相加的結果,保存在棧上位置為-0x80(%rbp),但是這里是4個float,其中高位三個都是0.0,最低位一個是s+s的結果
0x0000000000401510<+32>:mov-0x80(%rbp),%eax==>eax是保存結果的規定寄存器,保存一份結果,這下只會保存最低位的float,也就是我們需要的結果
0x0000000000401513<+35>:mov%eax,-0x80(%rbp)==>傳回去,有點繞,本質上是編譯器的不同,一些編譯器有一些特定的規則,主要的目的是為了下面傳遞給xmm0,只能從棧上穿,movss指令只能這樣用。
0x0000000000401516<+38>:movss-0x80(%rbp),%xmm0==>返回結果需要保存在xmm0中,所以又傳給它了。為什麼要穿來傳去呢,因為xmm0可以保存4個float,可以同時進行4個float運算,上面的步驟是為了保證,只有最後一個float運算的結果被保存,前面三個float,結果都是0.0,但是不管是什麼,結果都被忽略了。
0x000000000040151b<+43>:add$0x4,%rsp==>清除棧,返回
0x000000000040151f<+47>:pop%rbp
0x0000000000401520<+48>:retq
Ⅳ gcc g++ 使用哪些編譯選項可以讓編譯出來的程序兼容32位和64位
用32位的gcc,編譯出來後,能在32位上運行,也能在64位上兼容。
Ⅳ 64位linux編譯32位程序
這個比較麻煩。
首先你要裝好全套的 32 位對應的開發編譯支持環境和對應的運行環境,之後還要設置你這個軟體編譯時用 32 位的參數和 32 位的編譯器。
你這個其實等同於交叉編譯。
Ⅵ 如何編譯64位 boost類庫
64位windows平台,編譯環境是VS2005,進入Visual Studio 2005 x64 Win64 Command Prompt(單純的cmd也不一定不行,我沒試)。把bjam.exe放在boost根目錄下,進入根目錄,執行:
bjam --toolset=msvc address-model=64 --with-thread stage
bjam --toolset=msvc address-model=64 --with-date_time stage
關鍵選項:「address-model=64 」
64位Linux平台,使用gcc編譯。進入boost根目錄,執行:
./bjam --toolset=gcc --with-thread stage
./bjam --toolset=gcc --with-date_time stage
linux平台下倒是簡單,不過網上有篇文章介紹用如下命令編譯,不知道是多此一舉,還是適用於某些情況(非64位linux主機?)。
./bjam --toolset=gcc "-sBUILD=release <cxxflags>-m64" --with-thread stage
./bjam --toolset=gcc "-sBUILD=release <cxxflags>-m64" --with-date_time stage
唉。命令都很簡單,可浪費了我不少時間。usage根本沒寫,去看boost build的嘛,頁數n多不說,看完之後能否找到答案還是未知數。網上相關資料很少而且大多南轅北轍,只好一直搜索+嘗試。其實我只是想要個64位版本的庫而已,這應該不是啥稀罕的需求吧?
在windows平台下,編譯出來的是否是64位類庫,只有link 64位程序的時候才能發現。如果不是,link程序無法找到類庫中定義的函數或者類。linux不知道,因為我整出來直接就是64位了,我也懶得再找一台32位linux主機折騰了。
在1.37之後的boost,如果想要使用boost::thread庫,必須有boost::date_time庫。當然這件事情又一如既往很酷地沒有出現在容易看到的地方。而是讓你鏈接錯誤後再去玩抓蟲游戲。
轉載,僅供參考。
Ⅶ 編譯64位程序無法使用32位編譯的lib么
編譯64位程序,不一定要編譯機器是64位的,但是32位機器默認安裝的gcc編譯環境還是不能用來編譯64位程序。編譯64位程序,需要加上-m64編譯器參數,默認安裝的gcc已經支持該參數,但是缺少64位機器指令相關的文件,所以不能編譯,會出現下面的錯誤 In file included from /usr/include/features.h:378, from /usr/include/assert.h:37, from ../../../include/tinyxml/tinystr.h:42, from ../../../src/tinyxml/tinystr.cpp:32: /usr/include/gnu/stubs.h:9:27: error: gnu/stubs-64.h: 沒有那個文件或目錄這時候需要安裝 gcc所有支持文件 sudo apt-get install gcc-multilib 將會安裝下列額外的軟體包: cpp-4.4 g++-4.4 gcc-4.4 gcc-4.4-base gcc-4.4-multilib lib64gcc1 lib64gomp1 libc6-amd64 libc6-dev-amd64 libgcc1 libgomp1 libstdc++6 libstdc++6-4.4-dev 建議安裝的軟體包: gcc-4.4-locales g++-4.4-multilib gcc-4.4-doc libstdc++6-4.4-dbg libmudflap0-4.4-dev libgcc1-dbg libgomp1-dbg libmudflap0-dbg libcloog-ppl0 libppl-c2 libppl7 lib64mudflap0 libstdc++6-4.4-doc 下列【新】軟體包將被安裝: gcc-4.4-multilib gcc-multilib lib64gcc1 lib64gomp1 libc6-amd64 libc6-dev-amd64下列軟體包將被升級:
Ⅷ 64位linux下的GCC如何編譯出一個32位可執行程序
理論上安裝支持環境,之後 64 位的 gcc 編譯成 32 位程序,就加 -m32 參數即可。
當然還一個辦法是裝個 32 位的 gcc 。
另外,交叉編譯也適用於 x86 架構。
不過這么編譯經常會出現各種問題,所以編譯 32 位的程序,最好還是用 32 位系統。
不一定重裝,用 chroot 和 setarch 命令配合即可弄出一個 32 位的子系統。
