版權聲明:原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://future.blog.51cto.com/26959/88400
|
一、15個參數
1、r 從文件讀入
[root@watchout2 ~]# cat file
1 2 3 4 5 [root@watchout2 ~]# cat newfile
a b c d e [root@watchout2 ~]# sed '/a/r file' newfile (讀入文件file,并顯示在newfile文件中匹配行a之后)
a 1 2 3 4 5 b c d e [root@watchout2 ~]# touch /file [root@watchout2 ~]# echo "aaaaaaaaaaaaaaaaaaaaaaaaaa" > /file [root@watchout2 ~]# sed '/a/r /file' newfile (讀入的文件在不同的路徑) a aaaaaaaaaaaaaaaaaaaaaaaaaa b c d e [root@watchout2 ~]# 2、w寫入文件
[root@watchout2 ~]# sed '/a/w bo' newfile
a b c d e [root@watchout2 ~]# cat bo ([root@watchout2 ~]# sed -n '/a/w bobo' newfile ) a 3、a 追加命令
[root@watchout2 ~]# sed '/b/a \bobo' newfile
a b bobo
c d e 4、i 插入
[root@watchout2 ~]# sed '/a/i \bobo' newfile
bobo a b c d e 5、n 下一個
[root@watchout2 ~]# sed -n '/a/{n;p}' newfile(打印匹配行的下一行)
b [root@watchout2 ~]# sed '/a/{n;s/b/c/p}' newfile
a c c c d e 6、y 變形命令
[root@watchout2 ~]# sed '1,3y/abc/ABC/' newfile
A B C d e y命令就是將小寫轉換成了大寫,正則表達式元字符不能使用這個命令。
7、q 退出命令
[root@watchout2 ~]# sed '3q' newfile
a b c 打印前三行后退出。
8、h命令 是將pattern space 模式空間(臨時緩沖區)的內容復制到holding buffer保持緩沖區
9、G命令 是將holding buffer中的內容取得,爾后放回pattern space中,且追加到相應行的末 尾
g命令是將holding buffer 中的內容取得,爾后放回pattern space 中,且替換相應的行
[root@watchout2 ~]# sed -e '/a/h' -e '/d/G' newfile
a b c d a e h命令會把a匹配行,放入保持緩沖區,G命令會把保持緩沖區中的內容放入模式空間,并追加到匹配行d的下一行。
[root@watchout2 ~]# sed -e '/a/h' -e '$G' newfile
a b c d e a 與上相同,只是$代表最后一行。
[root@watchout2 ~]# sed -e '/a/h' -e '/b/g' newfile
a a c d e [root@watchout2 ~]# sed -e '/a/h' -e '$g' newfile a b c d a 以上h命令會把匹配行a,放入保持緩沖區,g命令會讀取保持緩沖區的內容,將匹配行b(第二個例子就是$最后一行)替換為a 。注:a將覆蓋匹配行b(第二個例子就是$最后一行)
10、x命令 是pattern space模式空間將被holding buffer保持緩沖區中的內容替換
[root@watchout2 ~]# sed -e '/a/h' -e '/d/x' newfile
a b c a e 匹配行d 將被匹配行a替換。
11、-n選項取消sed的默認行為,sed 默認行為是-p ,
root:/tmp>sed '/6/p' num -p參數打印num的內容,爾后匹配“6”在次打印6,所以6會出現兩次。
1 2 3 4 5 6 6 7 8 root:/tmp>sed -n '/6/p' num -n選項取消sed的默認行為(-p ),所以只打印“6” 6 root:/tmp> 12、刪除:d命令
刪除第6行
root:/tmp>sed '6d' num
1 2 3 4 5 7 8 root:/tmp> 從第6行刪除到行尾
root:/tmp>sed '6,$d' num
1 2 3 4 5 root:/tmp> d刪除最后一行
root:/tmp>sed '$d' num
1 2 3 4 5 6 7 root:/tmp> d刪除匹配行
root:/tmp>sed '/6/d' num
1 2 3 4 5 7 8 root:/tmp> 13、替換:s命令
s表示替換,g表示作用范圍整個行,如果沒有g標志則只有每行第一個被替換
root:/tmp>sed 's/1/8/g' num (sed默認有-p參數打印搜索后的所有行。如g后面加p,那么匹配行就會打印兩次)
8 2 3 4 5 6 7 8 root:/tmp> 行首“1”開頭被替換為“8”
root:/tmp>sed 's/^1/8/g' num
8 2 3 4 5 6 7 8 root:/tmp> &符號表示替換字符串中被找到的部分,所以每個數字后面被追加.6789
root:/tmp>sed 's/[0-9]/&.6789/g' num
1.6789 2.6789 3.6789 4.6789 5.6789 6.6789 7.6789 8.6789 root:/tmp> \(..\) 保存匹配的字符到標簽\1中。 s/\(5\)/\1.6789/ 藍色部分保存到標簽\1中。從表達式最左邊開始,向右最多可以使用9個標簽
root:/tmp>sed 's/\(5\)/\1.6789/g' num
1 2 3 4 5.6789 6 7 8 root:/tmp>sed 's/\([0-9]\)/\1.6789/g' num 1.6789 2.6789 3.6789 4.6789 5.6789 6.6789 7.6789 8.6789 root:/tmp> s后面的字符是分隔搜索字符串和替換字符串的分隔符。默認分隔符是斜杠,不論什么字符緊跟s命令都被認為是新的分隔符
root:/tmp>sed 's#6#shell#g' num
1 2 3 4 5 shell 7 8 root:/tmp> 14、多點編輯:e命令
root:/tmp>sed -e '1,6d' -e 's/8/8.shell/g' num
7 8.shell root:/tmp> 15、-f 引導sed腳本文件名
16、選定行的范圍:逗號
從第一行到第五行
root:/tmp>sed -n '1,5p' num
1 2 3 4 5 從第一行到第五行,然后在搜索
root:/tmp>sed '1,5s/3/3.linux/g' num 1 2 3.linux 4 5 6 7 8 顯示從第三行到行首為6的中間所有行
root:/tmp>sed -n '3,/^6/p' num 3 4 5 6 root:/tmp> 匹配1和5后面追加“******Total********”
root:/tmp>sed '/1/,/5/s/$/******Total********/g' num
1******Total******** 2******Total******** 3******Total******** 4******Total******** 5******Total******** 6 7 8 root:/tmp> |
在 Unix 上寫過程序的人一般都遇到過 Makefile,尤其是用 C 來開發程序的人。用 make 來開發和編譯程序的確很方便,可是要寫出一個MakeFile就不那么簡單了。偏偏介紹 Makefile 的文件不多,GNU Make 那份印出來要幾百頁的文件,光看完 Overview 自己就快要先Over了,難怪許多人聞 Unix色變。本文將介紹如何利用 GNU Autoconf 及 Automake 這兩套軟件來幫助『自動』產生 Makefile 文件,并且讓開發出來的的軟件可以象 Apache, MySQL 和常見的 GNU 軟件一樣,只要會 ``./configure'', ``make'', ``make install'' 就可以把程序安裝到系統中。如果您有心開發 Open Source 的軟件,或只是想在 Unix 系統下寫寫程序。希望這份介紹文件能幫助您輕松的進入 Unix Programming 的殿堂。 |
1. 簡介 |
Makefile 基本上就是『目標』(target), 『關聯』(dependencies) 和『動作』三者所組成的一系列規則。而 make 就會根據 Makefile 的規則來決定如何編譯 (compile) 和連接 (link) 程式。實際上,make 可做的不只是編譯和連接程序,例如 FreeBSD 的 port collection 中,Makefile還可以做到自動下載遠程程序,解壓縮 (extract) , 打補丁 (patch),設定,然后編譯,安裝到系統中。 |
Makefile 基本結構雖然很簡單,但是妥善運用這些規則就可以變換出許多不同的花樣。卻也因為這樣,許多剛剛開始學習寫Makefile 時會覺得沒有規范可以遵循,每個人寫出來的Makefile都不大一樣,不知道從哪里下手,而且常常會受到自己的開發環境的限制,只要環境參數不同或者路徑更改,可能 Makefile 就得跟著修改修改。雖然有 GNU Makefile Conventions (GNU Makefile慣例例)訂出一些使用 GNU 程式設計時撰寫 Makefile 的一些標準和規范,但是內容很長而且很復雜,并且經常作一些調整,為了減輕程序開發人員維護Makefile 的負擔,因此出現了Automake。 |
程序設計者只需要寫一些預先定義好的宏 (macro),提交給Automake處理后會產生一個可以供 Autoconf 使用的 Makefile.in文件。再配合利用 Autoconf產生的自動培植設置文件 configure 即可產生一份符合符合 GNU Makefile 慣例的 Makeifle 了。 |
2. 上路之前 |
在開始使用 Automake 之前,首先確認你的系統安裝有如下軟件: |
1. |
GNU Automake |
2. |
GNU Autoconf |
3. |
GNU m4 |
4. |
perl |
5. |
GNU Libtool (如果你需要產生 shared library) |
建議最好也使用 GNU C/C++ 編譯器 、GNU Make 以及其它 GNU 的工具程序來作為開發的環境,這些工具都是屬于 Open Source Software 不但免費而且功能強大。如果你是使用 Red Hat Linux 可以找到所有上述軟件的 rpm 文件,FreeBSD 也有現成的 package 可以直接安裝,或也可以自行下載這些軟件的源代碼回來安裝。下面的示例是在Red Hat Linux 5.2 + CLE2 的環境下所完成的。 |
3. 一個簡單的例子 |
Automake 所產生的 Makefile 除了可以做到程式的編譯和連接,也已經把如何產生程序文件 (如 manual page, info 文件及 dvi 文件) 的動作,還有把源碼文件包裝起來以供發布都考慮進去了,所以程序源代碼所存放的目錄結構最好符合GNU 的標準慣例,接下來就用一個hello.c 來做為例子。 |
在工作目錄下建立一個新的子目錄"devel"',再在 devel 下建立一個"hello"' 的子目錄,這個目錄將作為存放 hello這個程序及其相關文件的地方: |
% mkdir devel |
% cd devel |
% mkdir hello |
% cd hello |
用編輯器寫一個hello.c文件, |
#include |
int main(int argc, char** argv) { |
printf(``Hello, GNU!\n''); |
return 0; |
} |
接下來就要用 Autoconf 及 Automake 來產生 Makefile 文件了, |
1. |
用 autoscan 產生一個 configure.in 的原型,執行autoscan 后會產生一個configure.scan 的文件,可以用它作為 configure.in文件的藍本。 |
% autoscan |
% ls |
configure.scan hello.c |
2. |
編輯 configure.scan文件,如下所示,並且改名為configure.in |
dnl Process this file with autoconf to produce a configure script. AC_INIT(hello.c) AM_INIT_AUTOMAKE(hello, 1.0) |
dnl Checks for programs. |
AC_PROG_CC |
dnl Checks for libraries. |
dnl Checks for header files. |
dnl Checks for typedefs, structures, and compiler characteristics. |
dnl Checks for library functions. |
AC_OUTPUT(Makefile) |
3. |
執行 aclocal 和 autoconf ,分別會產生 aclocal.m4 及 configure 兩個文件 |
% aclocal |
% autoconf |
% ls |
aclocal.m4 configure configure.in hello.c |
4. |
編輯 Makefile.am 文件,內容如下 |
AUTOMAKE_OPTIONS= foreign |
bin_PROGRAMS= hello |
hello_SOURCES= hello.c |
5. |
執行 automake --add-missing ,Automake 會根據Makefile.am 文件產生一些文件,包含最重要的 Makefile.in |
% automake --add-missing automake: configure.in: installing `./install-sh' automake: configure.in: installing `./mkinstalldirs' automake: configure.in: installing `./missing' |
6. |
最后執行 ./configure , |
% ./configure creating cache ./config.cache checking for a BSD compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking whether make sets ${MAKE}... yes checking for working aclocal... found checking for working autoconf... found checking for working automake... found checking for working autoheader... found checking for working makeinfo... found checking for gcc... gcc checking whether the C compiler (gcc ) works... yes checking whether the C compiler (gcc ) is a cross-compiler... no checking whether we are using GNU C... yes checking whether gcc accepts -g... yes updating cache ./config.cache creating ./config.status creating Makefile |
現在你的目錄下已經產生了一個 Makefile 檔,下個 ``make'' 指令就可以開始編譯 hello.c 成執行檔,執行 ./hello 和 GNU 打聲招呼吧! |
% make gcc -DPACKAGE=\"hello\" -DVERSION=\"1.0\" -I. -I. -g -O2 -c hello.c gcc -g -O2 -o hello hello.o % ./hello Hello! GNU! |
你還可以試試 ``make clean'',''make install'',''make dist'' 看看會有什麼結果。你也可以把產生出來的 Makefile 秀給你的老闆,讓他從此對你刮目相看 :-) |
4. 追根問底 |
上述產生Makefile 的過程和以往自行編寫的方式非常不一樣,舍棄傳統自定義make 的規則,使用 Automake 只需用到一些已經定義好的宏就可以了。我們把宏及目標 (target)寫在Makefile.am 文件內,Automake 讀入 Makefile.am 文件后會把這一串已經定義好的宏展開并產生相對應的 Makefile.in 文件,然后再由 configure這個 shell script 根據 Makefile.in 產生合適的Makefile。 |
|
利用 autoconf 及 automake產生Makefile 的流程 |
上圖表示在上一范例中要使用的文件檔案及產生出來的文件,有星號 (*) 者代表可執行文件。在此示例中可由 Autoconf 及 Automake 工具所產生的額外文件有 configure.scan、aclocal.m4、configure、Makefile.in,需要自行加入設置的有configure.in 及 Makefile.am。 |
4.1 編輯 configure.in 文件 |
Autoconf 是用來產生 'configure'文件的工具。'configure' 是一個 shell script,它可以自動設定原始程序以符合各種不同平臺上Unix 系統的特性,并且根據系統參數及環境產生合適的Makefile文件或C 的頭文件(header file),讓原始程式可以很方便地在不同的平臺上進行編譯。Autoconf會讀取 configure.in 文件然后產生'configure' 這個 shell script。 |
configure.in 文件內容是一系列GNU m4 的宏,這些宏經autoconf處理后會變成檢查系統特性的shell scripts。 configure.in 內宏的順序并沒有特別的規定,但是每一個configure.in 文件必須在所有宏前加入 AC_INIT 宏,然后在所有宏的最后加上 AC_OUTPUT宏。可先用 autoscan 掃描原始文件以產生一個 configure.scan 文件,再對 configure.scan 做些修改成 configure.in 文件。在范例中所用到的宏如下: |
dnl |
這個宏后面的字不會被處理,可以視為注釋 |
AC_INIT(FILE) |
該宏用來檢查源代碼所在路徑,autoscan 會自動產生,一般無須修改它。 |
AM_INIT_AUTOMAKE(PACKAGE,VERSION) |
這個是使用 Automake 所必備的宏,PACKAGE 是所要產生軟件套件的名稱,VERSION 是版本編號。 |
AC_PROG_CC |
檢查系統可用的C編譯器,若源代碼是用C寫的就需要這個宏。 |
AC_OUTPUT(FILE) |
設置 configure 所要產生的文件,若是Makefile ,configure 便會把它檢查出來的結果帶入 Makefile.in 文件后產生合適的 Makefile。 |
實際上,這里使用 Automake 時,還需要一些其他的宏,這些額外的宏我們用 aclocal來幫助產生。執行 aclocal會產生aclocal.m4 文件,如果無特別的用途,可以不需要修改它,用 aclocal 所產生的宏會告訴 Automake如何動作。 |
有了 configure.in 及 aclocal.m4兩個文件以后,便可以執行 autoconf來產生 configure 文件了。 |
4.2 編輯Makefile.am 文件 |
接下來要編輯Makefile.am 文件,Automake 會根據 configure.in 中的宏把Makefile.am 轉成 Makefile.in 文件。 Makefile.am 文件定義所要產生的目標: |
AUTOMAKE_OPTIONS |
設置 automake 的選項。Automake 主要是幫助開發 GNU 軟件的人員來維護軟件,所以在執行 automake 時,會檢查目錄下是否存在標準 GNU 軟件中應具備的文件,例如 'NEWS'、'AUTHOR'、'ChangeLog' 等文件。設置 foreign 時,automake 會改用一般軟件的標準來檢查。 |
bin_PROGRAMS |
定義要產生的執行文件名。如果要產生多個執行文件,每個文件名用空白符隔開。 |
hello_SOURCES |
定義 'hello' 這個執行程序所需要的原始文件。如果 'hello'這個程序是由多個原始文件所產生,必須把它所用到的所有原始文件都列出來,以空白符隔開。假設 'hello' 還需要 'hello.c'、'main.c'、'hello.h' 三個文件的話,則定義 |
hello_SOURCES= hello.c main.c hello.h |
如果定義多個執行文件,則對每個執行程序都要定義相對的filename_SOURCES。 |
編輯好 Makefile.am 文件,就可以用 automake --add-missing來產生 Makefile.in。加上 --add-missing 選項來告訴 automake順便假如包裝一個軟件所必須的文件。Automake產生生出來的 Makefile.in 文件是完全符合 GNU Makefile 的慣例,只要執行 configure這個shell script 便可以產生合適的 Makefile 文件了。 |
4.3 使用 Makefile |
利用 configure 所產生的 Makefile文件有幾個預先設定的目標可供使用,這里只用幾個簡述如下: |
make all |
產生設定的目標,既次范例中的執行文件。只敲入make 也可以,此時會開始編譯源代碼,然后連接并產生執行文件。 |
make clean |
清除之前所編譯的執行文件及目標文件(object file, *.o)。 |
make distclean |
除了清除執行文件和目的文件以外,也把 configure 所產生的 Makefile 清除掉。 |
make install |
將程序安裝到系統中,若源碼編譯成功,且執行結果正確,便可以把程序安裝到系統預先設定的執行文件存放路徑中,若用 bin_PROGRAMS 宏的話,程序會被安裝到 /usr/local/bin下。 |
make dist |
將程序和相關的文檔包裝為一個壓縮文檔以供發布 (distribution) 。執行完在目錄下會產生一個以PACKAGE-VERSION.tar.gz 為名稱的文件。PACKAGE 和 VERSION 這兩個參數是根據 configure.in 文件中 AM_INIT_AUTOMAKE(PACKAGE, VERSION) 的定義。在此范例中會產生 'hello-1.0.tar.gz' 的文件。 |
make distcheck |
和 make dist 類似,但是加入檢查包裝以后的壓縮文件是否正常,這個目標除了把程序和相關文檔包裝成 tar.gz 文件外,還會自動把這個壓縮文件解開,執行 configure,并執行 make all ,確認編譯無錯誤以后,戶顯示這個 tar.gz 文件已經準備好可以發布了。這個檢查非常有用,檢查過關的套件,基本上可以給任何具備 GNU 開發環境的人去重新編譯成功。就 hello-1.tar.gz 這個范例而言,除了在Red Hat Linux 上,在 FreeBSD 2.2.x 也可以正確編譯。 |
要注意的是,利用 Autoconf 及 Automake 所產生出來的軟件套件是可以在沒有安裝 Autoconf 及 Automake 的環境使用的,因為 configure 是一個 shell script,它己被設計為可以在一般 Unix 的 sh 這個 shell 下執行。但是如果要修改 configure.in 及 Makefile.am 文件再產生新的 configure 及 Makefile.in 文件時就一定要有 Autoconf 及 Automake 了。 |
5. 相關資料 |
Autoconf 和 Automake 功能十分強大,可以從它們附帶的 info 穩當4中找到詳細的使用方法說明。你也可以從許多現有的GNU 軟件或 Open Source 軟件中找到相關的 configure.in 或 Makefile.am 文件,他們是學習 Autoconf 及 Automake 更多技巧的最佳范例。 |
這個簡介只用到了 Autoconf 及 Automake 的皮毛罷了,如果你有心加入 Open Source 軟件開發的行列,希望這篇文章可以幫助你對產生 Makefile 有個簡單的了解。其它有關開發 GNU 程式或 C 程序設計及 Makefile 的詳細運用及技巧,建議從 GNU Coding Standards (GNU 編碼規定) 讀起,里面包含了 GNU Makefile 慣例,及開發 GNU 軟件的標準程序和慣例。這些 GNU 軟件的在線說明文件可以在 http://www.gnu.org/ 上找到。 |
6. 結束語 |
利用 Autoconf 及 Automake,產生一個 Makefile 似乎不再象以前那么困難了,而使用 Autoconf 也使得我們在不同平臺上或各家 Unix 之間發布及便宜程序變的簡單,這對于在Unix 系統上程序開發員來說減輕了許多負擔。妥善運用這些 GNU 的工具軟件,可以幫助我們更容易的去開發程序,而且更容易維護源代碼。 |
+-------------------------+----> 高地址
| EIP (上級函數返回地址) |
+-------------------------+
+--> | EBP (上級函數的EBP) | --+ <------當前函數A的EBP (即SFP框架指針)
| +-------------------------+ +-->偏移量A
| | Local Variables | |
| | .......... | --+ <------ESP指向函數A新分配的局部變量,局部變量可以通過A的ebp-偏移量A訪問
| f +-------------------------+
| r | Arg n(函數B的第n個參數) |
| a +-------------------------+
| m | Arg .(函數B的第.個參數) |
| e +-------------------------+
| | Arg 1(函數B的第1個參數) |
| o +-------------------------+
| f | Arg 0(函數B的第0個參數) | --+ <------ B函數的參數可以由B的ebp+偏移量B訪問
| +-------------------------+ +--> 偏移量B
| A | EIP (A函數的返回地址) | |
| +-------------------------+ --+
+--- | EBP (A函數的EBP) |<--+ <------ 當前函數B的EBP (即SFP框架指針)
+-------------------------+ |
| Local Variables | |
| .......... | | <------ ESP指向函數B新分配的局部變量
+-------------------------+ |
| Arg n(函數C的第n個參數) | |
+-------------------------+ |
| Arg .(函數C的第.個參數) | |
+-------------------------+ +--> frame of B
| Arg 1(函數C的第1個參數) | |
+-------------------------+ |
| Arg 0(函數C的第0個參數) | |
+-------------------------+ |
| EIP (B函數的返回地址) | |
+-------------------------+ |
+--> | EBP (B函數的EBP) | --+ <------ 當前函數C的EBP (即SFP框架指針)
| +-------------------------+
| | Local Variables |
| | .......... | <------ ESP指向函數C新分配的局部變量
| +-------------------------+----> 低地址
frame of C
圖 1-1
sudo fdisk -l
df -T -h
mount
lspci
lsusb
sudo hdparm -d1 /dev/cdrom sudo cp /etc/hdparm.conf /etc/hdparm.conf_backup sudo gedit /etc/hdparm.conf
/dev/cdrom { dma = on }
sudo mount /media/cdrom0/ -o unhide
sudo umount /media/cdrom0/
sudo umount /media/cdrom0/ -l
sudo mount -a
sudo umount /dev/cdrom cdrecord dev=/dev/cdrom blank=fast
nautilus burn:///
檔案選單 -> 燒錄光盤... -> 燒錄
點選影像檔(ISO)右鍵 -> 燒錄光盤... -> 燒錄
sudo umount /dev/cdrom dd if=/dev/cdrom of=file.iso bs=1024
mkisofs -o file.iso /location_of_folder/
md5sum file.iso > file.iso.md5
md5sum -c file.iso.md5
sudo mkdir /media/iso sudo modprobe loop sudo mount file.iso /media/iso/ -t iso9660 -o loop
sudo umount /media/iso/
/ -> apps -> nautilus-cd-burner -> default_speed (設定/改變 燒錄速度)
/ -> apps -> nautilus-cd-burner -> burnproof (勾選)
/ -> apps -> nautilus-cd-burner -> overburn (勾選)
連線 -> 選擇 "以太網連線" -> 啟動/停止使用
連線 -> 選擇 "以太網連線" -> 屬性 連線 -> 啟動這個連線 (勾選) 連線設定 -> 組態: 選擇 "DHCP/固定 IP 位址"
DNS -> DNS 服務器 -> 新增/刪除
sudo pppconfig
sudo pon provider_name
sudo poff
sudo pppoeconf
一般 -> 主機設定 -> 主機名稱: 指定計算機名稱
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_backup sudo gedit /etc/samba/smb.conf
... server string = %h server (Samba, Ubuntu) ...
server string = new_computer_descriptions
sudo testparm sudo /etc/init.d/samba restart
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_backup sudo gedit /etc/samba/smb.conf
... workgroup = MSHOME ...
workgroup = new_domain_or_workgroup
sudo testparm sudo /etc/init.d/samba restart
sudo apt-get install ipcheck sudo gedit /root/dyndns_update.sh
USERNAME=myusername PASSWORD=mypassword HOSTNAME=myhostname.dyndns.org
cd /root/ if [ -f /root/ipcheck.dat ]; then ipcheck -r checkip.dyndns.org:8245 $USERNAME $PASSWORD $HOSTNAME else ipcheck --makedat -r checkip.dyndns.org:8245 $USERNAME $PASSWORD $HOSTNAME fi
sudo chmod 700 /root/dyndns_update.sh sudo sh /root/dyndns_update.sh export EDITOR=gedit && sudo crontab -e
00 * * * * sudo sh /root/dyndns_update.sh
資料夾上按右鍵 -> 共享資料夾
共享資料夾 -> 共享為: 選擇 "SMB" 共享內容 -> 名稱: 指定共享名稱
smb://192.168.0.1/linux
sudo mkdir /media/sharename sudo mount //192.168.0.1/linux /media/sharename/ -o username=myusername,password=mypassword
sudo umount /media/sharename/
sudo mkdir /media/sharename sudo mount //192.168.0.1/linux /media/sharename/ -o username=myusername,password=mypassword,dmask=777,fmask=777
sudo umount /media/sharename/
sudo mkdir /media/sharename sudo gedit /root/.smbcredentials
username=myusername password=mypassword
sudo chmod 700 /root/.smbcredentials sudo cp /etc/fstab /etc/fstab_backup sudo gedit /etc/fstab
//192.168.0.1/linux /media/sharename smbfs credentials=/root/.smbcredentials 0 0
sudo mkdir /media/sharename sudo gedit /root/.smbcredentials
username=myusername password=mypassword
sudo chmod 700 /root/.smbcredentials sudo cp /etc/fstab /etc/fstab_backup sudo gedit /etc/fstab
//192.168.0.1/linux /media/sharename smbfs credentials=/root/.smbcredentials,dmask=777,fmask=777 0 0
共享 -> 允許其他使用者觀看您的桌面 (勾選) 允許其他使用者控制您的桌面 (勾選)
安全性 -> 詢問您已確認 (不勾選) 使用者需要輸入密碼: (勾選) 密碼: 指定密碼
vncviewer -fullscreen 192.168.0.1:0
Press 'F8' -> Quit viewer
sudo mkdir /media/windows sudo mount /dev/hda1 /media/windows/ -t ntfs -o nls=utf8,umask=0222
sudo umount /media/windows/
sudo mkdir /media/windows sudo mount /dev/hda1 /media/windows/ -t vfat -o iocharset=utf8,umask=000
sudo umount /media/windows/
sudo mkdir /media/windows sudo cp /etc/fstab /etc/fstab_backup sudo gedit /etc/fstab
/dev/hda1 /media/windows ntfs nls=utf8,umask=0222 0 0
sudo mkdir /media/windows sudo cp /etc/fstab /etc/fstab_backup sudo gedit /etc/fstab
/dev/hda1 /media/windows vfat iocharset=utf8,umask=000 0 0
http://www.yuanma.org/data/2007/0406/article_2498.htm
gcc和g++的區別 我們在編譯c/c++代碼的時候,有人用gcc,有人用g++,于是各種說法都來了,譬如c代碼用gcc,而c++代碼用g++,或者說編譯用 gcc,鏈接用g++,一時也不知哪個說法正確,如果再遇上個extern "C",分歧就更多了,這里我想作個了結,畢竟知識的目的是令人更清醒,而不是更糊涂。
誤區一:gcc只能編譯c代碼,g++只能編譯c++代碼
兩者都可以,但是請注意: 1.后綴為.c的,gcc把它當作是C程序,而g++當作是c++程序;后綴為.cpp的,兩者都會認為是c++程序,注意,雖然c++是c的超集,但是兩者對語法的要求是有區別的,例如:
#include <stdio.h>
int main(int argc, char* argv[]) {
if(argv == 0) return; printString(argv);
return;
} int printString(char* string) { sprintf(string, "This is a test.\n"); } 如果按照C的語法規則,OK,沒問題,但是,一旦把后綴改為cpp,立刻報三個錯:“printString未定義”;
“cannot convert `char**' to `char*”;
”return-statement with no value“;
分別對應前面紅色標注的部分。可見C++的語法規則更加嚴謹一些。
2.編譯階段,g++會調用gcc,對于c++代碼,兩者是等價的,但是因為gcc命令不能自動和C++程序使用的庫聯接,所以通常用g++來完成鏈接,為了統一起見,干脆編譯/鏈接統統用g++了,這就給人一種錯覺,好像cpp程序只能用g++似的。
誤區二:gcc不會定義__cplusplus宏,而g++會
實際上,這個宏只是標志著編譯器將會把代碼按C還是C++語法來解釋,如上所述,如果后綴為.c,并且采用gcc編譯器,則該宏就是未定義的,否則,就是已定義。 誤區三:編譯只能用gcc,鏈接只能用g++
嚴格來說,這句話不算錯誤,但是它混淆了概念,應該這樣說:編譯可以用gcc/g++,而鏈接可以用g++或者gcc -lstdc++。因為gcc命令不能自動和C++程序使用的庫聯接,所以通常使用g++來完成聯接。但在編譯階段,g++會自動調用gcc,二者等價。 誤區四:extern "C"與gcc/g++有關系
實際上并無關系,無論是gcc還是g++,用extern "c"時,都是以C的命名方式來為symbol命名,否則,都以c++方式命名。試驗如下: me.h: extern "C" void CppPrintf(void); me.cpp:
#include <iostream> #include "me.h" using namespace std; void CppPrintf(void) { cout << "Hello\n"; } test.cpp:
#include <stdlib.h> #include <stdio.h> #include "me.h" int main(void) { CppPrintf(); return 0; } 1. 先給me.h加上extern "C",看用gcc和g++命名有什么不同
[root@root G++]# g++ -S me.cpp [root@root G++]# less me.s .globl _Z9CppPrintfv //注意此函數的命名 .type CppPrintf, @function [root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s .globl _Z9CppPrintfv //注意此函數的命名 .type CppPrintf, @function 完全相同! 2. 去掉me.h中extern "C",看用gcc和g++命名有什么不同 [root@root GCC]# gcc -S me.cpp [root@root GCC]# less me.s .globl _Z9CppPrintfv //注意此函數的命名 .type _Z9CppPrintfv, @function [root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s .globl _Z9CppPrintfv //注意此函數的命名 .type _Z9CppPrintfv, @function 完全相同! 【結論】完全相同,可見extern "C"與采用gcc/g++并無關系,以上的試驗還間接的印證了前面的說法:在編譯階段,g++是調用gcc的。
|
http://blog.csdn.net/blade2001/archive/2007/06/10/1646530.aspx
gcc and g++分別是gnu的c & c++編譯器 gcc/g++在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的文件[預處理器cpp] 2.將預處理后的文件不轉換成匯編語言,生成文件.s[編譯器egcs] 3.有匯編變為目標代碼(機器代碼)生成.o的文件[匯編器as] 4.連接目標代碼,生成可執行程序[鏈接器ld] [參數詳解] -x language filename 設定文件所使用的語言,使后綴名無效,對以后的多個有效.也就是根據約定C語言的后 綴名稱是.c的,而C++的后綴名是.C或者.cpp,如果你很個性,決定你的C代碼文件的后綴 名是.pig 哈哈,那你就要用這個參數,這個參數對他后面的文件名都起作用,除非到了 下一個參數的使用。 可以使用的參數嗎有下面的這些 `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `a ssembler-with-cpp'. 看到英文,應該可以理解的。 例子用法: gcc -x c hello.pig -x none filename 關掉上一個選項,也就是讓gcc根據文件名后綴,自動識別文件類型 例子用法: gcc -x c hello.pig -x none hello2.c -c 只激活預處理,編譯,和匯編,也就是他只把程序做成obj文件 例子用法: gcc -c hello.c 他將生成.o的obj文件 -S 只激活預處理和編譯,就是指把文件編譯成為匯編代碼。 例子用法 gcc -S hello.c 他將生成.s的匯編代碼,你可以用文本編輯器察看 -E 只激活預處理,這個不生成文件,你需要把它重定向到一個輸出文件里面. 例子用法: gcc -E hello.c > pianoapan.txt gcc -E hello.c | more 慢慢看吧,一個hello word 也要與處理成800行的代碼 -o 制定目標名稱,缺省的時候,gcc 編譯出來的文件是a.out,很難聽,如果你和我有同感 ,改掉它,哈哈 例子用法 gcc -o hello.exe hello.c (哦,windows用習慣了) gcc -o hello.asm -S hello.c -pipe 使用管道代替編譯中臨時文件,在使用非gnu匯編工具的時候,可能有些問題 gcc -pipe -o hello.exe hello.c -ansi 關閉gnu c中與ansi c不兼容的特性,激活ansi c的專有特性(包括禁止一些asm inl ine typeof關鍵字,以及UNIX,vax等預處理宏, -fno-asm 此選項實現ansi選項的功能的一部分,它禁止將asm,inline和typeof用作關鍵字。 -fno-strict-prototype 只對g++起作用,使用這個選項,g++將對不帶參數的函數,都認為是沒有顯式的對參數 的個數和類型說明,而不是沒有參數. 而gcc無論是否使用這個參數,都將對沒有帶參數的函數,認為城沒有顯式說明的類型 -fthis-is-varialble 就是向傳統c++看齊,可以使用this當一般變量使用. -fcond-mismatch 允許條件表達式的第二和第三參數類型不匹配,表達式的值將為void類型 -funsigned-char -fno-signed-char -fsigned-char -fno-unsigned-char 這四個參數是對char類型進行設置,決定將char類型設置成unsigned char(前兩個參 數)或者 signed char(后兩個參數) -include file 包含某個代碼,簡單來說,就是便以某個文件,需要另一個文件的時候,就可以用它設 定,功能就相當于在代碼中使用#i nclude<filename> 例子用法: gcc hello.c -include /root/pianopan.h -imacros file 將file文件的宏,擴展到gcc/g++的輸入文件,宏定義本身并不出現在輸入文件中 -Dmacro 相當于C語言中的#define macro -Dmacro=defn 相當于C語言中的#define macro=defn -Umacro 相當于C語言中的#undef macro -undef 取消對任何非標準宏的定義 -Idir 在你是用#i nclude"file"的時候,gcc/g++會先在當前目錄查找你所制定的頭文件,如 果沒有找到,他回到缺省的頭文件目錄找,如果使用-I制定了目錄,他 回先在你所制定的目錄查找,然后再按常規的順序去找. 對于#i nclude<file>,gcc/g++會到-I制定的目錄查找,查找不到,然后將到系統的缺 省的頭文件目錄查找 -I- 就是取消前一個參數的功能,所以一般在-Idir之后使用 -idirafter dir 在-I的目錄里面查找失敗,講到這個目錄里面查找. -iprefix prefix -iwithprefix dir 一般一起使用,當-I的目錄查找失敗,會到prefix+dir下查找 -nostdinc 使編譯器不再系統缺省的頭文件目錄里面找頭文件,一般和-I聯合使用,明確限定頭 文件的位置 -nostdin C++ 規定不在g++指定的標準路經中搜索,但仍在其他路徑中搜索,.此選項在創libg++庫 使用 -C 在預處理的時候,不刪除注釋信息,一般和-E使用,有時候分析程序,用這個很方便的 -M 生成文件關聯的信息。包含目標文件所依賴的所有源代碼你可以用gcc -M hello.c 來測試一下,很簡單。 -MM 和上面的那個一樣,但是它將忽略由#i nclude<file>造成的依賴關系。 -MD 和-M相同,但是輸出將導入到.d的文件里面 -MMD 和-MM相同,但是輸出將導入到.d的文件里面 -Wa,option 此選項傳遞option給匯編程序;如果option中間有逗號,就將option分成多個選項,然 后傳遞給會匯編程序 -Wl.option 此選項傳遞option給連接程序;如果option中間有逗號,就將option分成多個選項,然 后傳遞給會連接程序. -llibrary 制定編譯的時候使用的庫 例子用法 gcc -lcurses hello.c 使用ncurses庫編譯程序 -Ldir 制定編譯的時候,搜索庫的路徑。比如你自己的庫,可以用它制定目錄,不然 編譯器將只在標準庫的目錄找。這個dir就是目錄的名稱。 -O0 -O1 -O2 -O3 編譯器的優化選項的4個級別,-O0表示沒有優化,-O1為缺省值,-O3優化級別最高 -g 只是編譯器,在編譯的時候,產生調試信息。 -gstabs 此選項以stabs格式聲稱調試信息,但是不包括gdb調試信息. -gstabs+ 此選項以stabs格式聲稱調試信息,并且包含僅供gdb使用的額外調試信息. -ggdb 此選項將盡可能的生成gdb的可以使用的調試信息. -static 此選項將禁止使用動態庫,所以,編譯出來的東西,一般都很大,也不需要什么 動態連接庫,就可以運行. -share 此選項將盡量使用動態庫,所以生成文件比較小,但是需要系統由動態庫. -traditional 試圖讓編譯器支持傳統的C語言特性 |