⑴ 如何在cygwin中使用make命令產生可執行文件
你的電腦沒有安裝GCC 做法是: 找到cygwin的安裝程序,點開,前面都別動,路徑什麼的別動,沿用你之前安裝CYGWIN的路徑。然後到了鏡像選擇163的鏡像,等到選擇包的時候,在select裡面輸入 gcc,把default點擊一下變成install然後安裝就行了 等如何在cygwin中使用make命令產生可執行文件
⑵ cygwin下make的時候,出現deferencing pointer to incomplete type
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
typedef struct record{
char title[50]; //書名
//char author[50];
//double price;
//int quantity;
struct record *link;
}Node;
//void instruction(void);
void addbook(char *, Node **);
void printbooklist(Node **);
int main(){
Node *Head = NULL;
char Title[50];
//instruction();
printf("Enter the title of the book : ");
scanf(" %[^\n]",&Title);
addbook(Title,&Head);
printbooklist(&Head);
printf("\n");
return 0;
}
//void instruction(){
void addbook(char *title, Node **Head){
Node *p1;
int i;
p1 = (Node *)malloc(sizeof(Node[50]));
for(i = 0; i < 50; i++)
{
p1->title[i] = title[i];
}
p1->link = NULL;
if (*Head == NULL){
*Head = p1;
}
else{
p1->link = *Head;
*Head= p1;
}
}
void printbooklist(Node **Head){
Node *t;
t = *Head;
printf("The title is : ");
while (t != NULL){
printf("%s",t->title);
t = t->link;
}
}
看了一個小時,終於看到了,你定義的結構體內部Title是個字元串,那麼你要將你定義的Title[50]裡面的內容給p1->title。 上面為正確代碼 ,在VS2012內成功運行。
⑶ windows 下開發 android 需要安裝 cygwin嗎
一、Android NDK環境簡介
Android NDK 是運行於Android 平台上的Native Development Kit 的縮寫。
Android 應用開發者可以通過NDK 調用C 或C++ 本地代碼。
更多介紹參見:http://developer.android.com/sdk/ndk/1.5_r1/index.html
二 、搭建Android NDK環境
安裝cygwin
要在Windows 平台上進行NDK的開發,需要安裝cygwin(一個在windows平台上模擬linux的軟體),NDK 編譯需要用到Cygwin 中的make 和gcc, 所以先來下載並安裝Cygwin 關於cygwin 安裝比較復雜,其下載地址:http://www.cygwin.com/
安裝步驟:
1.選擇安裝方式:
1)Install from Internet:直接從Internet上下載並立即安裝(安裝完成後,下載好的安裝文件並不會被刪除,而是仍然被保留,以便下次再安裝)。
2)Download Without Installing:只是將安裝文件下載到本地,但暫時不安裝。
3)Install from Local Directory:不下載安裝文件,直接從本地某個含有安裝文件的目錄進行安裝。
2、選擇第一項,然後點擊下一步:
3、選擇要安裝的目錄,注意,最好不要放到有中文和空格的目錄里,似乎會造成安裝出問題,其它選項不用變,之後點下一步:
4、上一步是選擇安裝cygwin的目錄,這個是選擇你下載的安裝包所在的目錄,默認是你運行setup.exe的目 錄,直接點下一步就可以:
5、此時你共有三種連接方式選擇:
1) Direct Connection:直接連接。
2) Use IE5 Settings:使用IE的連接參數設置進行連接。
3) Use HTTP/FTP Proxy:使用HTTP或FTP代理伺服器進行連接(需要輸入伺服器地址、埠號)。
用戶可根據自己的網路連接的實情情況進行選擇,一般正常情況下,均選擇第一種,也就是直接連接方式。然後再點擊「下一步」,
6、 這是選擇要下載的站點,在提供的下載站點中選擇一個,選擇後點下一步
7、 此時會下載載入安裝包列表
8、Search是可以輸入你要下載的包的名稱,能夠快速篩選出你要下載的包。那四個單選按鈕是選擇下邊樹的樣式,默認就行,不用動。View默認是Category,建議改成full顯示全部包再查,省的一些包被隱藏掉。左下角那個復選框是是否隱藏過期包,默認打鉤,不用管它就行,下邊開始下載我們要安裝的包吧,為了避免全部下載,這里列出了後面開發NDK用得著的包:autoconf2.1、automake1.10、binutils、gcc-core、gcc- g++、gcc4-core、gcc4-g++、gdb、pcre、pcre-devel、gawk、make共12個包
9、 然後開始選擇安裝這些包吧,點skip,把它變成數字版本格式,要確保Bin項變成叉號,而Src項是源碼,這個 就沒必要選了。
10、 下面測試一下cygwin是不是已經安裝好了。
運行cygwin,在彈出的命令行窗口輸入:cygcheck -c cygwin命令,會列印出當前cygwin的版本和運行狀 態,如果status是ok的話,則cygwin運行正常。
然後依次輸入gcc –version,g++ --version,make –version,gdb –version進行測試,如果都列印出版本信息和一些描述信息,非常高興的告訴你,你的cygwin安裝完成了!
安裝 Android NDK
可到Android官網下載:http://developer.android.com/sdk/ndk/index.html
注意選擇相應的版本下載,下載後將其解壓就可以了。
配置cygwin,用UtriaEdit打開cygwin安裝目錄下的home/<你的用戶名>/.bach-profile文件,在後面加上
NDK=/cygdrive/<NDK安裝路徑>
export NDK
兩行,也可以在windows 下添加 環境變數 $NDK=<NDK安裝路徑>。
注意:這里如果是中文OS 使用記事本或者寫字板打開編輯後,重新啟動Cygwin 會報錯(編碼不同)。
(這部有可能不成功 需要用一個dos2unix.exe把bash_profile這個文件轉下編碼,具體下載地址大家自己找找) 我直接用的 notepad++ 修改的沒有問題。
至此,我們就可以用安裝好的NDK來編譯一個簡單的程序吧,我們選擇ndk自帶的例子hello-jni,我的位於d/android-ndk-r7c/samples/hello-jni (根據你具體的安裝位置而定),
運行cygwin,輸入命令cd /cygdrive/d/android-ndk-r7c/samples/hello-jni,進入到d/android-ndk-r7c/samples/hello-jni目錄。
輸入$NDK/ndk-build,執行成功後,它會自動生成一個libs目錄,把編譯生成的.so文件放在裡面。($NDK是調用我們之前配置好的環境變數,ndk-build是調用ndk的編譯程序)
如圖:
現在我們終於可以用NDK來編譯完成 jni 例子了 。 以上的需要命令來編譯,下就用Eclipse CDT 插件來完成
安裝CDT插件
CDT是一個使Eclipse支持C/C++的插件。這是下載地址:http://www.eclipse.org/cdt/downloads.php
可以通過在Eclipse 中 help > Install New Software 中安裝, 現在,進入Help – Install New Software菜單項,增加一項:CDT - http://download.eclipse.org/tools/cdt/releases/helios, 等待更新項目樹載入,然後選中Programming Languages分支下的Eclipse C/C++ Development Tools,然後點擊Next按鈕。按照後續的提示,接受預設的選項,最後必須接受許可,以便讓Eclipse完成更新。完成後,你將會看到要求重啟Eclipse的提示,點擊Yes按鈕,等待Eclipse重啟。現在你的Eclipse就支持C/C++了。
也可以下載插件到本地 ,從本地安裝插件。(網路有時候比較。。。)
注意,下載對應 Eclipse 版本的插件 附正版本圖
配置C/C++的編譯器
1、 打開eclipse,導入ndk自帶的hello-jni例子,右鍵單擊項目名稱,點擊Properties,彈出配置界面,之後再點擊Builders,彈出項目的編譯工具列表,之後點擊New,新添加一個編譯器,點擊後出現添加界面,選擇Program,點 擊OK
2、出現了添加界面,首先給編譯配置起個名字,如:C_Builder
設置Location為<你cygwin安裝路徑>\bin\bash.exe程序,例如:E:\cygwin\bin\bash.exe,設置Working Directory為<你cygwin安裝路徑>\bin目錄,例如:E:\cygwin\bin
設置Arguments為
--login -c "cd /cygdrive/d/android-ndk-r7c/samples/hello-jni && $NDK/ndk-build"
上面的配置中 d/android-ndk-r7c/samples/hello-jni 是你當前要編譯的程序的目錄,$NDK是之前配置 的ndk的環境變數,這兩個根據你具體的安裝目錄進行配置,其他的不用變,Arguments這串參數實際是 給bash.exe命令行程序傳參數,進入要編譯的程序目錄,然後運行ndk-build編譯程序
3、接著切換到Refresh選項卡,給Refresh resources upon completion打上鉤
4、然後切換到Build Options選項卡,勾選上最後三項
5、之後點擊Specify Resources按鈕,選擇資源目錄,勾選你的項目目錄即可
6、 最後點擊Finish,點擊OK一路把剛才的配置都保存下來,注意:如果你配置的編譯器在其它編譯器下邊,記得一定要點Up按鈕,把它排到第一位,否則C代碼的編譯晚於Java代碼的編譯,會造成你的C代碼要編譯兩次才能看到最新的修改
7、 編譯配置也配置完成啦,現在來測試一下是否可以自動編譯呢,當你點擊 ok 完成之後 其實在console 就可以看到 自動編譯信息
如圖:
打開項目jni目錄里的hello-jni.c文件把提示Hello from JNI!改成其他的文字:如:Hello,My name is 。。。。,然後再模擬器中運行你的程序,模擬器中應該就顯示了你最新修改的文字! 如果以上的步驟都沒錯的話。
⑷ 如何在沒有make的Cygwin中編譯生成make.exe
由於我在安裝cygwin時忘了包含make包,所以安裝後發現我在bash中無法使用make命令。但是一般在cygwin下面的軟體都是要用make來實現編譯和安裝的。沒有make,又如何編譯生成make.exe呢?我琢磨了一些,依靠查看man文件找到了方法。
本文以 make 3.81 版本為例。前提是我的cygwin里有GCC 3.4.4了。
首先,別的不說,先曲下載一個make 3.81的壓縮包,在cygwin下解壓縮,進入解壓縮得到的文件夾中。依次鍵入:
./configure
./build.sh
於是在當前文件夾中會自動生成make.exe。然後將復制或者移動到shell命令根目錄下:
mvmake.exe /bin
然後就可以在任意cygwin路徑下使用make了。
本回答由提問者推薦
⑸ 如何在cygwin中使用make命令產生可執行文件
你的電腦沒有安裝GCC
做法是:
找到cygwin的安裝程序,點開,前面都別動,路徑什麼的別動,沿用你之前安裝CYGWIN的路徑。然後到了鏡像選擇163的鏡像,等到選擇包的時候,在select裡面輸入 gcc,把default點擊一下變成install.然後安裝就行了
等到安裝完了再重新試一次就好了
⑹ cygwin 中如何安裝arm-linux-gcc交叉編譯器
交叉編譯工具鏈作為嵌入式Linux開發的基礎,直接影響到嵌入式開發的項目進度和完成質量。由於目前大多數開發人員使用Windows作為嵌入式開發的宿主機,在Windows中通過安裝VMware等虛擬機軟體來進行嵌入式Linux開發,這樣對宿主機的性能要求極高。Cygwin直接作為Windows下的軟體完全能滿足嵌入式Linux的開發工作,對硬體的要求低及方便快捷的特點成為嵌入式開發的最佳選擇。
目前網路上Cygwin下直接可用的交叉編譯器寥寥無幾且版本都比較低,不能滿足開源軟體對編譯器版本依賴性的要求(如低版本工具鏈編譯U-Boot出現軟浮點問題等);Crosstool等交叉工具鏈製作工具也是更新跟不上自由軟體版本的進度;同時系統介紹Cygwin下製作交叉編譯器方面的資料很少。針對上述情況,基於最新版gcc等自由軟體構建Cygwin下的交叉編譯器顯得尤為迫切和重要。
構建前准備工作
首先Cygwin下必須保證基本工具比如make}gcc等來構建bootstrap-gcc編譯器,這可以在安裝Cygwin時選擇安裝。參照gcc等安裝說明文檔來在Cygwin下查看是否已經安裝,如輸入gcc --v等。
源碼下載
gcc-4.5.0的編譯需mpc的支持,而mpc又依賴gmp和mpfr庫。從各個項目官方網站上下載的最新的源碼:
binutils-2.20. l .tar.bz2
gmp-S.O. l .tar.bz2
mpc-0.8.2.tar.gz
mpfr-3.O.O.tar.bz2
gcc-4.S.O.tar.bz2
linux-2.6.34.tar.bz2
glibc-2.11.2.tar.bz2
glibc-ports-2. l l .tar.bz2
gdb-7. l.tar.bz2
設置環境變數
HOST:工具鏈要運行的目標機器;BUILD:用來建立工具鏈的機器;TARGET工具鏈編譯產生的二進制代碼可以運行的機器。
BUILD=i686-pc-cygwin
HOST=i686-pc-cygwin TARGET=arm-linux
SYSROOT指定根目錄,$PREFIX指定安裝目錄。目標系統的頭文件、庫文件、運行時對象都將被限定在其中,這在交叉編譯中有時很重要,可以防止使用宿主機的頭文件和庫文件。本文首選$SYSROOT為安裝目錄,$PREFIX主要作為glibc庫安裝目錄。
SYSROOT=/cross-root
PREFIX=/cross-root/arm-linux
由於GCC-4.5.0需要mpfr,gmp,mpc的支持,而這三個庫又不需要交叉編譯,僅僅是在編譯交叉編譯鏈時使用,所以放在一個臨時的目錄。
TEMP_PREFIX=/build-temp
控制某些程序的本地化的環境變數:
LC ALL=POSIX
設置環境變數:
PATH=$SYSROOT/bin:兒in:/usr/bin
設置編譯時的線程數f31減少編譯時間:
PROCS=2
定義各個軟體版本:
BINUTILS V=2.20.1
GCC V=4.5.0
GMP V=5.0.1
MPFR V=3.0.0
MPC V二0.8.2
LINUX V二2.6.34
GLIBC V=2.11.2
GLIBC-PORTS V=2.11
GDB V=7.1
構建過程詳解
鑒於手工編譯費時費力,統一把構建過程寫到Makefile腳本文件中,把其同源碼包放在同一目錄下,執行make或順次執行每個命令即可進行無人值守的編譯安裝交叉工具
鏈。以下主要以Makefile執行過程為主線進行講解。
執行「make」命令實現全速運行
可在Cygwin的Shell環境下執行「make>make.log 2>&1」命令把編譯過程及出現的錯誤都輸出到make.log中,便於查找:
all:prerequest install-deps install-cross-stage-one install-
cross-stage-two
預處理操作
"make prerequest',命令實現單步執行的第一步,實現輸出變數、建立目錄及解壓源碼包等操作。0'set十h」關閉bash的Hash功能,使要運行程序的時候,shell將總是搜索PATH里的目錄[4]。這樣新工具一旦編譯好,shell就可以在$(SYSROOT)/bin目錄里找到: prerequest:
set +h&&mkdir -p $(SYSROOT)/bin&&
mkdir -p $(PREFIX)/include&&
mkdir -p $(TEMP一REFIX)&&
export PATH LCes ALL&&
tar -xvf gmp-$(GMP_V).tar.bz2&&
tar -xvf mpfr-$(MPFR_V).tar.bz2&&
tar -xvf mpc-$(MPC_V).tar.gz&&
tar -xvf binutils-$(BINUTILS_V).tar.bz2&&
tar -xvf gcc-$(GCC_V).tar.bz2&&
tar -xvf linux-$(LINUX_V).tar.bz2&&
tar -xvf glibc-$(GLIBC_V).tar.bz2&&
tar -xvf glibc-ports-$(GLIBC-PORTS_V).tar.bz2&&
my glibc-ports-$(GLIBC-PORTS_V)
glibc-$(GLIBC_V)/ports&&
tar -xvf gdb-$(GDB V).tar.bz2
非交叉編譯安裝gcc支持包mpc
00make install-deps」命令實現單步執行的第二步,實現mpc本地編譯,mpc依賴於gmp和mpfr
install-deps:gmp mpfr mpc
gmp:gmp-$(GMP_V)
mkdir -p build/gmp&&cd build/gmp&&
../../gmp-*/configure
--disable-shared --prefix=$(TEMP_PREFIX)&&
$(MAKE)一$(PROCS)&&$(MAKE) install
mpfr:mpfr-$(MPFR_V)
mkdir -p b-uild/mpfr&&cd build/mpfr&&
../..//mpfr-*/configure
LDF'LAGS="-Wl,-search_paths_first」--disable-shared
--with-gmp=$(TEMP_PREFIX)
--prefix=$(TEMP_PREFIX)&&
$(MAKE)一$(PROCS) all&&$(MAKE) install
mpc: mpc-$(MPC_V) gmp mpfr
mkdir -p build/mpc&&cd build/mpc&&
../../mpc-*/configure
--with-mpfr=$(TEMP PREFIX)
--with-gmp=$(TEMP_PREFIX)
--prefix=$(TEMP_PREFIX)&&
$(MAKE)一$(PROCS)&&$(MAKE) install
交叉編譯第一階段
"make install-cross-stage-one',命令實現單步執行的第三步,編譯安裝binutils,bootstrap-gcc和獲取Linux內核頭文件:
install-cross-stage-one:cross-binutils cross-gcc get-kernel-headers
編譯安裝binutils
cross-binutils: binutils-$(BINUTILS_ V)
mkdir -p build/binutils&&cd build/binutils&&
../..//binutils-*/configure --prefix=$(SYSROOT)
--target=$(TARGET)--disable-nls&&
$(MAKE)j$(PROCS)&&$(MAKE) install
編譯安裝bootstrap-gcc。使用一disable-shared參數的意思是不編譯和安裝libgcc_ eh.a文件。glibc軟體包依賴這個庫,因為它使用其內部的一lgcc_eh來創建系統[6]。這種依賴
性,可通過建立一個指向libgcc.a符號鏈接得到滿足,因為該文件最終將含有通常在libgcc- eh.a中的對象(也可通過補丁文件實現)。
cross-gcc:gcc-$(GCC_V)
mkdir -p build/gcc&&cd build/gcc&&
二//gcc-*/configure
--target=$(TARGET)--prefix=$(SYSROOT)
--disable-nls --disable-shared --disable-multilib
--disable-decimal-float--disable-threads
--disable-libmudflap --disable-libssp
--disable-libgomp --enable-languages=c
--with-gmp=$(TEMP_PREFIX)
--with-mpfr=$(TEMP_PREFIX)
--with-mpc=$(TEMP_PREFIX)&&
$(MAKE) -j$(PROCS)&&$(MAICE) install&&
In -vs libgcc.a'arm-linux-gcc -print-libgcc-file-name I
sed's/libgcc/& eh/'}
獲取Linux內核頭文件:
get-kernel-headersainux-$(LINUX_V)
cd linux-$(LINUX_V)&&
$(MAICE) mrproper&&$(MAKE) headers check&&
$(MAKE) ARCH=arm&&
INSTALLes HDR_ PATH=dest headers_ install&&
find dest/include
(-name .install一。-name ..installNaNd)-delete&&
cp -rv desdinclude/* $(PREFIX)/include
交叉編譯第二階段
編譯安裝glibc、重新編譯安裝binutils、完整編譯安裝gcc和編譯安裝gdb o "make install-cross-stage-two',命令實現單步執行的第四步: install-cross-stage-two:cross-glibc cross-rebinutils cross-g++ cross-gdb
編譯安裝glibca glib。的安裝路徑特意選為$(PREFIX),與gcc更好找到動態鏈接庫也有關系,選在$(SYSROOT)提示找不到crti.o; glibc已經不再支持i386; glibc對ARM等的處理器的支持主要通過glibc-ports包來實現;正確認識大小寫敏感(Case Sensitive)和大小寫不敏感(CaseInsensitive)系統,大小寫敏感問題主要影響到glibc,是交叉編譯glibc成功的關鍵:Cygwin幫助手冊中可知Cygwin是默認大小寫不敏感的n},但是UNIX系統是大小寫敏感的,這也是Cygwin和UNIX類系統的一個區別。通過作者自行參考製作的glibc-2.11.2-cygwin.patch補T使glibc變為Case-Insensitive,此補丁主要是對大小寫敏感問題改名來實現。
交叉編譯過程中安裝的鏈接器,在安裝完Glibc以前都無法使用。也就是說這個配置的forced unwind支持測試會失敗,因為它依賴運行中的鏈接器。設置libc_ cvforced unwind=yes這個選項是為了通知configure支持force-unwind,而不需要進行測試。libc cv_c_cleanup=yes類似的,在configure腳本中使用libc_cv_c cleanup=yes,以便配置成跳過測試而支持C語言清理處理。
cross-glibc:glibc-$(GLIBC_V)
cd glibc-$(GLIBC_V)&&
patch -Np 1 –i...//glibc-2.11.2-cygwin.patch&&
cd..&&mkdir -p build/glibc&&
cd build/glibc&&
echo"libc cv_forcedes unwind=yes">config.cache&&
echo "libc cv_c_cleanup=yes">>config.cache&&
echo "libc cv_arm_tls=yes">>config.cache&&
../../glibc-*/configure --host=$(TARGET)
--build=$(../OneScheme/glibc-2.11.2/scripts/config.guess)
--prefix=$(PREFIX)--disable-profile
--enable-add-ons --enable-kernel=2.6.22.5
--with-headers=$(PREFIX)/include
--cache-file=config.cache&&
$(MAKE)&&$(MAKE) install
重新編譯安裝binutils。編譯之前要調整工具鏈,使其
指向新生成的動態連接器。
調整工具鏈:
SPECS=
'dirname $(arm-linux-gcc -print-libgcc-file-name)'/specs
arm-linux-gcc -mpspecs
sed -e 's@/lib(64)\?/ld@$(PREFTX)&@g' -e ,}/}}*cPP}$/{n;s,$,-isystem $(PREFIX)/include,}"
>$SPECS
echo "New specs file is: $SPECS"
unset SPECS
測試調整後工具鏈:
echo 'main(川』>mmy.c
arm-linux-gcc
-B/cross-root/arm-linux/lib mmy.c
readelf -1 a.out I grep』:/cross-roobarm-linux'
調整正確的輸出結果:
[Requesting program interpreter: /tools/lib/ld-linux.so.2j
一切正確後刪除測試程序:
rm -v mmy.c a.out
重新編譯binutils。指定--host,--build及--target,否則配置不成功,其config.guess識別能力不如gcc做的好。
cross-rebinutils: binutils-$(BINUTILS_V)
mkdir -p build/rebinutils&&
cd build/rebinutils&&CC="$(TARGET)-gcc
-B/cross-roodarm-linux/lib/"&&AR=$(TARGET)-ar&&
RANLIB=$(TARGET)-ranlib&&../..//binutils-*/configure
--host=$(HOST)--build=$(BUILD)--target=$(TARGET)
--prefix=$(SYSROOT)--disable-nls
--with-lib-path=$(PREFIX)/lib&&
$(MAKE)--$(PROCS)&&$(MAKE) install
高於4.3版的gcc把這個編譯當作一個重置的編譯器,並且禁止在被一prefix指定的位置搜索startfiles。因為這次不是重置的編譯器,並且$(SYSROOT)目錄中的startfiles對於創
建一個鏈接到$$(SYSROOT)目錄庫的工作編譯器很重要,所以我們使用下面的補丁,它可以部分還原gcc的老功能tai . patch -Npl –i../gcc-4.5.0-startfiles_fix-l.patch
在正常條件下,運行gcc的fixincludes腳本,是為了修復可能損壞的頭文件。它會把宿主系統中已修復的頭文件安裝到gcc專屬頭文件目錄里,通過執行下面的命令,可以抑
制fixincludes腳本的運行[9](此時目錄為/gcc-4.5.0)。
cp -v gcc/Makefile.in{,.orig}
sed 's@\./fixinc\.sh@-c true@'
gcc/Makefile.in.orig > gcc/Makefile.in
下面更改gcc的默認動態鏈接器的位置,使用已安裝在/cross-root/ann-linux目錄下的鏈接器,這樣確保在gcc真實的編譯過程中使用新的動態鏈接器。即在編譯過程中創建的所有
二進制文件,都會鏈接到新的glibc文件
for file in
$(find gcc/config -name linux64.h-o -name linux.h –o -name sysv4.h)
do cp -uv $file{,.orig}
sed -a 's@/lib(64)?(32)?/Id@/cross-root/arm-linux&@g』-e's@/usr@/cross-rootlarm-linux@g' $file.orig>$file echo『
#undef STANDARD INCLUDE DIR
#define STANDARD_ INCLUDE DIR "/cross-root/arm-linux/include"
#define STANDARD STARTFILE PREFIX 1 "/cross-root/arm-linux/lib"
#define STANDARD_ STARTFILE_ PREFIX_ 2」」』>>$file
touch $file.orig done
完整編譯安裝gcc。最好通過指定--libexecdir更改libexecdir到atm-linux目錄下。--with-local-prefix選項指定gcc本地包含文件的安裝路徑此處設為$$(PREFIX),安裝後就會在內核頭文件的路徑下。路徑前指定$(Pwd)則以當前路徑為基點,不指定則默認以/home路徑為基點,這點要注意。
cross-g++:gcc-$(GCC-)
mkdir -p build/g十+&&cd build/g++&&
CC="$(TARGET)-gcc AR=$(TARGET)-ar&&
-B/cross-roodarm-linux/lib/"&&
RANLIB=$(TARGET)-ranlib&&
..//gcc-*/configure
--host=$(HOST)--build=$(BUILD)--target=$(TARGET)
--prefix=$(SYSROOT)--with-local-prefix=$(PREFIX)
--enable-clocale=gnu --enable-shared
--enable-threads=posix --enable -cxa_atexit
--enable-languages=c,c++--enable-c99
--enable-long-long --disable-libstdcxx-pch
--disable-libunwind-exceptions
--with-gmp=$(TEMP_PREFIX)
--with-mpfr=$(TEMP_PREFIX)
--with-mpc=$(TEMP_PREFIX)&&
$(MAKE) LD_IBRARY_ATH=
$(pwd)/$(../../gcc-4.5.0/config.guess)/libgcc&&
$(MAKE) install
編譯安裝gdb,至此完成整個工具鏈的製作。
cross-gdb: gdb-$(GDB V)
mkdir -p build/gdb&&cd build/gdb&&
../../gdb-*/configure --prefix=$(SYSROOT)
--target=$(TARGET)--disable-werror&&
$(MAKE)-j$(PROCS)&&$(MAKE) install
「make clean」命令清除編譯生成的文件和創建解壓的文件夾
.PHONY:clean
dean:
rm -fr $(TEMP_PREFIX) build
binutils-$(BINUTIL,S_V) gcc-$(GCC_V)
glibc-$(NEWL.IB_V) gdb-$(GDB_V)
gmp-$(GMP_V) mpc-$(MPC_V) mpfr-$(MPFR_V)
工具鏈測試
命令行中輸入以下內容:
echo 'main(){}』>mmy.c
arm-linux-gcc -o mmy.exe mmy.c
file mmy.exe
運行正常的結果:
mmy.exe: ELF 32-bit LSB executable, ARM, version 1,for GNU/Linux 2.6.22, dynamically linked (uses shared libs),not stripped.
⑺ 在makefile中判斷是cygwin還是Linux系統
交叉編譯工具鏈作為嵌入式Linux開發的基礎,直接影響到嵌入式開發的項目進度和完成質量。由於目前大多數開發人員使用Windows作為嵌入式開發的宿主機,在Windows中通過安裝VMware等虛擬機軟體來進行嵌入式Linux開發,這樣對宿主機的性能要求極高。Cygwin直接作為Windows下的軟體完全能滿足嵌入式Linux的開發工作,對硬體的要求低及方便快捷的特點成為嵌入式開發的最佳選擇。 目前網路上Cygwin下直接可用的交叉編譯器寥寥無幾且版本都比較低,不能滿足開源軟體對編譯器版本依賴性的要求(如低版本工具鏈編譯U-Boot出現軟浮點問題等);Crosstool等交叉工具鏈製作工具也是更新跟不上自由軟體版本的進度;同時系統介紹Cygwin下製作交叉編譯器方面的資料很少。針對上述情況,基於最新版gcc等自由軟體構建Cygwin下的交叉編譯器顯得尤為迫切和重要。 構建前准備工作 首先Cygwin下必須保證基本工具比如make}gcc等來構建bootstrap-gcc編譯器,這可以在安裝Cygwin時選擇安裝。參照gcc等安裝說明文檔來在Cygwin下查看是否已經安裝,如輸入gcc --v等。 源碼下載 gcc-4.5.0的編譯需mpc的支持,而mpc又依賴gmp和mpfr庫。從各個項目官方網站上下載的最新的源碼: binutils-2.20. l .tar.bz2 gmp-S.O. l .tar.bz2 mpc-0.8.2.tar.gz mpfr-3.O.O.tar.bz2 gcc-4.S.O.tar.bz2 linux-2.6.34.tar.bz2 glibc-2.11.2.tar.bz2 glibc-ports-2. l l .tar.bz2 gdb-7. l.tar.bz2 設置環境變數 HOST:工具鏈要運行的目標機器;BUILD:用來建立工具鏈的機器;TARGET工具鏈編譯產生的二進制代碼可以運行的機器。 BUILD=i686-pc-cygwin HOST=i686-pc-cygwin TARGET=arm-linux SYSROOT指定根目錄,$PREFIX指定安裝目錄。目標系統的頭文件、庫文件、運行時對象都將被限定在其中,這在交叉編譯中有時很重要,可以防止使用宿主機的頭文件和庫文件。本文首選$SYSROOT為安裝目錄,$PREFIX主要作為glibc庫安裝目錄。 SYSROOT=/cross-root PREFIX=/cross-root/arm-linux 由於GCC-4.5.0需要mpfr,gmp,mpc的支持,而這三個庫又不需要交叉編譯,僅僅是在編譯交叉編譯鏈時使用,所以放在一個臨時的目錄。 TEMP_PREFIX=/build-temp 控制某些程序的本地化的環境變數: LC ALL=POSIX 設置環境變數: PATH=$SYSROOT/bin:兒in:/usr/bin 設置編譯時的線程數f31減少編譯時間: PROCS=2 定義各個軟體版本: BINUTILS V=2.20.1 GCC V=4.5.0 GMP V=5.0.1 MPFR V=3.0.0 MPC V二0.8.2 LINUX V二2.6.34 GLIBC V=2.11.2 GLIBC-PORTS V=2.11 GDB V=7.1 構建過程詳解 鑒於手工編譯費時費力,統一把構建過程寫到Makefile腳本文件中,把其同源碼包放在同一目錄下,執行make或順次執行每個命令即可進行無人值守的編譯安裝交叉工具 鏈。以下主要以Makefile執行過程為主線進行講解。 執行「make」命令實現全速運行 可在Cygwin的Shell環境下執行「make>make.log 2>&1」命令把編譯過程及出現的錯誤都輸出到make.log中,便於查找: all:prerequest install-deps install-cross-stage-one install- cross-stage-two 預處理操作 "make prerequest',命令實現單步執行的第一步,實現輸出變數、建立目錄及解壓源碼包等操作。0'set十h」關閉bash的Hash功能,使要運行程序的時候,shell將總是搜索PATH里的目錄[4]。這樣新工具一旦編譯好,shell就可以在$(SYSROOT)/bin目錄里找到: prerequest: set +h&&mkdir -p $(SYSROOT)/bin&& mkdir -p $(PREFIX)/include&& mkdir -p $(TEMP一REFIX)&& export PATH LCes ALL&& tar -xvf gmp-$(GMP_V).tar.bz2&& tar -xvf mpfr-$(MPFR_V).tar.bz2&& tar -xvf mpc-$(MPC_V).tar.gz&& tar -xvf binutils-$(BINUTILS_V).tar.bz2&& tar -xvf gcc-$(GCC_V).tar.bz2&& tar -xvf linux-$(LINUX_V).tar.bz2&& tar -xvf glibc-$(GLIBC_V).tar.bz2&& tar -xvf glibc-ports-$(GLIBC-PORTS_V).tar.bz2&& my glibc-ports-$(GLIBC-PORTS_V) glibc-$(GLIBC_V)/ports&& tar -xvf gdb-$(GDB V).tar.bz2 非交叉編譯安裝gcc支持包mpc 00make install-deps」命令實現單步執行的第二步,實現mpc本地編譯,mpc依賴於gmp和mpfr install-deps:gmp mpfr mpc gmp:gmp-$(GMP_V) mkdir -p build/gmp&&cd build/gmp&& ../../gmp-*/configure --disable-shared --prefix=$(TEMP_PREFIX)&& $(MAKE)一$(PROCS)&&$(MAKE) install mpfr:mpfr-$(MPFR_V) mkdir -p b-uild/mpfr&&cd build/mpfr&& ../..//mpfr-*/configure LDF'LAGS="-Wl,-search_paths_first」--disable-shared --with-gmp=$(TEMP_PREFIX) --prefix=$(TEMP_PREFIX)&& $(MAKE)一$(PROCS) all&&$(MAKE) install mpc: mpc-$(MPC_V) gmp mpfr mkdir -p build/mpc&&cd build/mpc&& ../../mpc-*/configure --with-mpfr=$(TEMP PREFIX) --with-gmp=$(TEMP_PREFIX) --prefix=$(TEMP_PREFIX)&& $(MAKE)一$(PROCS)&&$(MAKE) install 交叉編譯第一階段 "make install-cross-stage-one',命令實現單步執行的第三步,編譯安裝binutils,bootstrap-gcc和獲取Linux內核頭文件: install-cross-stage-one:cross-binutils cross-gcc get-kernel-headers 編譯安裝binutils cross-binutils: binutils-$(BINUTILS_ V) mkdir -p build/binutils&&cd build/binutils&& ../..//binutils-*/configure --prefix=$(SYSROOT) --target=$(TARGET)--disable-nls&& $(MAKE)j$(PROCS)&&$(MAKE) install 編譯安裝bootstrap-gcc。使用一disable-shared參數的意思是不編譯和安裝libgcc_ eh.a文件。glibc軟體包依賴這個庫,因為它使用其內部的一lgcc_eh來創建系統[6]。這種依賴 性,可通過建立一個指向libgcc.a符號鏈接得到滿足,因為該文件最終將含有通常在libgcc- eh.a中的對象(也可通過補丁文件實現)。 cross-gcc:gcc-$(GCC_V) mkdir -p build/gcc&&cd build/gcc&& 二//gcc-*/configure --target=$(TARGET)--prefix=$(SYSROOT) --disable-nls --disable-shared --disable-multilib --disable-decimal-float--disable-threads --disable-libmudflap --disable-libssp --disable-libgomp --enable-languages=c --with-gmp=$(TEMP_PREFIX) --with-mpfr=$(TEMP_PREFIX) --with-mpc=$(TEMP_PREFIX)&& $(MAKE) -j$(PROCS)&&$(MAICE) install&& In -vs libgcc.a'arm-linux-gcc -print-libgcc-file-name I sed's/libgcc/& eh/'} 獲取Linux內核頭文件: get-kernel-headersainux-$(LINUX_V) cd linux-$(LINUX_V)&& $(MAICE) mrproper&&$(MAKE) headers check&& $(MAKE) ARCH=arm&& INSTALLes HDR_ PATH=dest headers_ install&& find dest/include (-name .install一。-name ..installNaNd)-delete&& cp -rv desdinclude/* $(PREFIX)/include 交叉編譯第二階段 編譯安裝glibc、重新編譯安裝binutils、完整編譯安裝gcc和編譯安裝gdb o "make install-cross-stage-two',命令實現單步執行的第四步: install-cross-stage-two:cross-glibc cross-rebinutils cross-g++ cross-gdb 編譯安裝glibca glib。的安裝路徑特意選為$(PREFIX),與gcc更好找到動態鏈接庫也有關系,選在$(SYSROOT)提示找不到crti.o; glibc已經不再支持i386; glibc對ARM等的處理器的支持主要通過glibc-ports包來實現;正確認識大小寫敏感(Case Sensitive)和大小寫不敏感(CaseInsensitive)系統,大小寫敏感問題主要影響到glibc,是交叉編譯glibc成功的關鍵:Cygwin幫助手冊中可知Cygwin是默認大小寫不敏感的n},但是UNIX系統是大小寫敏感的,這也是Cygwin和UNIX類系統的一個區別。通過作者自行參考製作的glibc-2.11.2-cygwin.patch補T使glibc變為Case-Insensitive,此補丁主要是對大小寫敏感問題改名來實現。 交叉編譯過程中安裝的鏈接器,在安裝完Glibc以前都無法使用。也就是說這個配置的forced unwind支持測試會失敗,因為它依賴運行中的鏈接器。設置libc_ cvforced unwind=yes這個選項是為了通知configure支持force-unwind,而不需要進行測試。libc cv_c_cleanup=yes類似的,在configure腳本中使用libc_cv_c cleanup=yes,以便配置成跳過測試而支持C語言清理處理。 cross-glibc:glibc-$(GLIBC_V) cd glibc-$(GLIBC_V)&& patch -Np 1 –i...//glibc-2.11.2-cygwin.patch&& cd..&&mkdir -p build/glibc&& cd build/glibc&& echo"libc cv_forcedes unwind=yes">config.cache&& echo "libc cv_c_cleanup=yes">>config.cache&& echo "libc cv_arm_tls=yes">>config.cache&& ../../glibc-*/configure --host=$(TARGET) --build=$(../OneScheme/glibc-2.11.2/scripts/config.guess) --prefix=$(PREFIX)--disable-profile --enable-add-ons --enable-kernel=2.6.22.5 --with-headers=$(PREFIX)/include --cache-file=config.cache&& $(MAKE)&&$(MAKE) install 重新編譯安裝binutils。編譯之前要調整工具鏈,使其 指向新生成的動態連接器。 調整工具鏈: SPECS= 'dirname $(arm-linux-gcc -print-libgcc-file-name)'/specs arm-linux-gcc -mpspecs sed -e 's@/lib(64)\?/ld@$(PREFTX)&@g' -e ,}/}}*cPP}$/{n;s,$,-isystem $(PREFIX)/include,}" >$SPECS echo "New specs file is: $SPECS" unset SPECS 測試調整後工具鏈: echo 'main(川』>mmy.c arm-linux-gcc -B/cross-root/arm-linux/lib mmy.c readelf -1 a.out I grep』:/cross-roobarm-linux' 調整正確的輸出結果: [Requesting program interpreter: /tools/lib/ld-linux.so.2j 一切正確後刪除測試程序: rm -v mmy.c a.out 重新編譯binutils。指定--host,--build及--target,否則配置不成功,其config.guess識別能力不如gcc做的好。 cross-rebinutils: binutils-$(BINUTILS_V) mkdir -p build/rebinutils&& cd build/rebinutils&&CC="$(TARGET)-gcc -B/cross-roodarm-linux/lib/"&&AR=$(TARGET)-ar&& RANLIB=$(TARGET)-ranlib&&../..//binutils-*/configure --host=$(HOST)--build=$(BUILD)--target=$(TARGET) --prefix=$(SYSROOT)--disable-nls --with-lib-path=$(PREFIX)/lib&& $(MAKE)--$(PROCS)&&$(MAKE) install 高於4.3版的gcc把這個編譯當作一個重置的編譯器,並且禁止在被一prefix指定的位置搜索startfiles。因為這次不是重置的編譯器,並且$(SYSROOT)目錄中的startfiles對於創 建一個鏈接到$$(SYSROOT)目錄庫的工作編譯器很重要,所以我們使用下面的補丁,它可以部分還原gcc的老功能tai . patch -Npl –i../gcc-4.5.0-startfiles_fix-l.patch 在正常條件下,運行gcc的fixincludes腳本,是為了修復可能損壞的頭文件。它會把宿主系統中已修復的頭文件安裝到gcc專屬頭文件目錄里,通過執行下面的命令,可以抑 制fixincludes腳本的運行[9](此時目錄為/gcc-4.5.0)。 cp -v gcc/Makefile.in{,.orig} sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in 下面更改gcc的默認動態鏈接器的位置,使用已安裝在/cross-root/ann-linux目錄下的鏈接器,這樣確保在gcc真實的編譯過程中使用新的動態鏈接器。即在編譯過程中創建的所有 二進制文件,都會鏈接到新的glibc文件 for file in $(find gcc/config -name linux64.h-o -name linux.h –o -name sysv4.h) do cp -uv $file{,.orig} sed -a 's@/lib(64)?(32)?/Id@/cross-root/arm-linux&@g』-e's@/usr@/cross-rootlarm-linux@g' $file.orig>$file echo『 #undef STANDARD INCLUDE DIR #define STANDARD_ INCLUDE DIR "/cross-root/arm-linux/include" #define STANDARD STARTFILE PREFIX 1 "/cross-root/arm-linux/lib" #define STANDARD_ STARTFILE_ PREFIX_ 2」」』>>$file touch $file.orig done 完整編譯安裝gcc。最好通過指定--libexecdir更改libexecdir到atm-linux目錄下。--with-local-prefix選項指定gcc本地包含文件的安裝路徑此處設為$$(PREFIX),安裝後就會在內核頭文件的路徑下。路徑前指定$(Pwd)則以當前路徑為基點,不指定則默認以/home路徑為基點,這點要注意。 cross-g++:gcc-$(GCC-) mkdir -p build/g十+&&cd build/g++&& CC="$(TARGET)-gcc AR=$(TARGET)-ar&& -B/cross-roodarm-linux/lib/"&& RANLIB=$(TARGET)-ranlib&& ..//gcc-*/configure --host=$(HOST)--build=$(BUILD)--target=$(TARGET) --prefix=$(SYSROOT)--with-local-prefix=$(PREFIX) --enable-clocale=gnu --enable-shared --enable-threads=posix --enable -cxa_atexit --enable-languages=c,c++--enable-c99 --enable-long-long --disable-libstdcxx-pch --disable-libunwind-exceptions --with-gmp=$(TEMP_PREFIX) --with-mpfr=$(TEMP_PREFIX) --with-mpc=$(TEMP_PREFIX)&& $(MAKE) LD_IBRARY_ATH= $(pwd)/$(../../gcc-4.5.0/config.guess)/libgcc&& $(MAKE) install 編譯安裝gdb,至此完成整個工具鏈的製作。 cross-gdb: gdb-$(GDB V) mkdir -p build/gdb&&cd build/gdb&& ../../gdb-*/configure --prefix=$(SYSROOT) --target=$(TARGET)--disable-werror&& $(MAKE)-j$(PROCS)&&$(MAKE) install 「make clean」命令清除編譯生成的文件和創建解壓的文件夾 .PHONY:clean dean: rm -fr $(TEMP_PREFIX) build binutils-$(BINUTIL,S_V) gcc-$(GCC_V) glibc-$(NEWL.IB_V) gdb-$(GDB_V) gmp-$(GMP_V) mpc-$(MPC_V) mpfr-$(MPFR_V) 工具鏈測試 命令行中輸入以下內容: echo 'main(){}』>mmy.c arm-linux-gcc -o mmy.exe mmy.c file mmy.exe 運行正常的結果: mmy.exe: ELF 32-bit LSB executable, ARM, version 1,for GNU/Linux 2.6.22, dynamically linked (uses shared libs),not stripped.
⑻ 如何卸載Cygwin
但是它畢竟是一個模擬的軟體,我們還是得安裝一個真正的linux版本才行,但是當想要刪除cywin這個軟體的時候卻遇到了問題,根本就是無從下手,在cygwin安裝的文件夾下和windows的添加和刪除程序中根本就沒有它的存在,如果是直接shift+delete這個文件夾,有時系統還會報告出錯誤,說某些文件無法刪除。 在這里我說一下這個問題的解決方案:記得在安裝cygwin的時候那個setup文件了嗎,我們卸載它也要用這個文件,進入setup後還在按照步驟下一步....下一步,之後會來到您需要安裝文件包的那個環節,如果你先前選擇了All-install,則這些則把這一項改為all-uninstall即可。如果你之前安裝選擇了自定義的安裝,則把對應項改為uninstall即可。就是這么簡單是吧!!!然後點擊下一步,一切就都OK了!
⑼ cygwin下make出錯,怎麼回事(cygwin是完全安裝的)
如果cygwin下make出錯,可能是由於硬碟出現問題引起的,需要換個硬碟來解決問題。
硬碟的磁性圓盤由硬質材料製成,有很高的精密度。硬碟連同驅動器一起封閉在殼體內,在它的容量比優盤和光碟大得多,讀寫速度比優盤和光碟快得多。
硬碟是由幾片硬碟片環繞一個共同的軸心組成的碟片組,兩個碟片之間僅留出安置磁頭的距離。每個碟片有兩個盤面,盤面上劃分著許多同心圓,稱為磁軌。這些同心圓周長不同,但存儲量卻相同。每個磁軌被分為很多區域,每個區域叫做一個扇區,每個扇區存儲五百十二個位元組的信息。在硬碟中,幾個碟片上相同磁軌號的集合叫做柱面,這些磁軌有一個相同的磁場旋轉方向。每個盤面對應一個磁頭,但現在的硬碟,兩個磁頭可以讀取一個碟片。所以硬碟容量由柱面數、盤面數、每磁軌的扇區數決定。硬碟容量等於柱面數乘以盤面數乘以每個磁軌的扇區數乘以512,一般以GB、TB為單位,很多硬碟廠商計算GB和TB時是十進制的,1GB是1000MB,1TB是1000GB。
硬碟內部由磁儲存檔片組成,數量從一片到三片不等,每個碟片有一定的容量,叫做單碟容量,幾個碟片的容量之和就是硬碟總容量。
硬碟的主軸馬達帶動碟片高速旋轉,產生浮力使磁頭飄浮在碟片上方,硬碟通過磁頭來讀取碟片上的數據,轉速越快,數據讀取的時間也就越短。轉速在很大程度上決定硬碟的速度。
硬碟的磁頭移動到盤面指定的磁軌所用的時間叫做平均尋道時間,單位為毫秒,這個時間越小越好。
數據傳輸率是電腦從硬碟中准確找到相應數據並傳輸到內存的速率,包括內部數據傳輸率和外部數據傳輸率,是用單位時間可傳輸幾兆位元組衡量的。硬碟的介面有IDE介面和SCSI介面。
⑽ cygwin 下執行make怎麼沒反應
原因可能是你沒裝Gcc,你可以去網上找個能在cygwin平台上用的gcc