平台是ubuntu20.04。
還是那個超級簡單的例子,在android上的編譯和執行可看之前文章:c交叉編譯成可執行檔案在android上執行
因為突然想到android那篇忘記涉及到執行c程式時傳命令列引數這部分,又想到linux和android上的c程式編譯和執行又並不完全一樣,故而有了這篇。
實驗步驟:
新建資料夾hello:
建立hello.c和makefile。
test@test-vostro-
3268:~
/wahaha/hello$ ls
makefile hello.c
hello.c內容:
#include
intmain
(int argc,
char
* ar**)
//argc是命令列執行時輸入的引數個數,ar**是引數字串陣列,ar**[0]是應用名稱
printf
("hello world\n");
printf
("goodbye\n");
return0;
}
makefile內容:
hello: hello.o
default
: gcc -c hello.c
gcc -o hello hello.o
clean:
rm hello hello.o
install:
sudo cp hello /sbin
編譯時的輸出:
(如果不sudo make install,則呼叫該程式時,需要在~/wahaha/hello
下的終端裡輸入./hello test 123
才可執行)
test@test-vostro-
3268:~
/wahaha/hello$ make
cc -c -o hello.o hello.c
cc hello.o -o hello
test@test-vostro-
3268:~
/wahaha/hello$ make clean
rm hello hello.o
test@test-vostro-
3268:~
/wahaha/hello$ make
cc -c -o hello.o hello.c
cc hello.o -o hello
test@test-vostro-
3268:~
/wahaha/hello$ sudo make install
[sudo] password for test:
sudo cp hello /sbin
test@test-vostro-
3268:~
/wahaha/hello$
執行效果:
//只要cp到了/sbin中,任何資料夾位置的終端裡均可呼叫該程式。
test@test-vostro-
3268:~
/wahaha$ hello test 123
argc=
3ar**[1]
= hello
ar**[2]
= test
ar**[3]
=123
hello world
goodbye
test@test-vostro-
3268:~
/wahaha$
在android平台上的命令列傳參也是同樣的,第乙個int變數是引數個數,第二個是引數陣列。這樣就可以在main函式裡對命令列引數進行利用了。
關於這部分具體實現的原理,之後會抽時間單寫一篇原始碼分析。
ps:注意一下生成出來的可執行檔案hello的許可權,可ls-l hello檢視。如果沒有執行的許可權,會報錯permission denied。這時候只需要chmod 777 hello即可。
Linux中將c檔案編譯成可執行檔案的方法
c檔案 project.c 方法一 預編譯,生成已編譯通過的c原始程式 i gcc e project.c o project.i 編譯,生成組合語言原始程式 s gcc s project.i o project.s 鏈結,生成可執行程式 gcc o project.exe project.s 方...
Linux中將c檔案編譯成可執行檔案的方法
c檔案 project.c 方法一 預編譯,生成已編譯通過的c原始程式 i gcc e project.c o project.i 編譯,生成組合語言原始程式 s gcc s project.i o project.s 鏈結,生成可執行程式 gcc o project.exe project.s 方...
Linux如何原始檔逐步編譯成可執行檔案
首先先上圖對編譯的整個過程有個感性的認識,然後再逐步分析各個過程。以hello.c 程式為例 乙個.c源程式需要經過預處理器生成.i檔案,再經過編譯器生成.s檔案,再經過彙編器生成可重定位目標檔案.o檔案,再與其他.o檔案經過鏈結器生成最終的可執行目標程式。1,預處理階段。主要是處理原始檔中以 開頭...