目錄
一. 在Ubuntu系統(tǒng)下用c語言編寫一個簡單的輸出hello world 的程序,并編譯、運行。
1.1 gcc/g++簡介
1.2 c++程序輸出 Hello World:
1.3?c語言程序輸出 Hello World:
二. 編寫一個主程序文件main1.c和一個子程序文件sub1.c,實現(xiàn)函數(shù)間的調(diào)用
2.1? 編寫sub1.c 和main1.c 函數(shù)
2.1.1 編寫sub1.c函數(shù)
2.1.2 編寫main1.c函數(shù),賦值a=3,b=2
2.2? ?將sub1.c程序封裝為動態(tài)庫或者靜態(tài)庫
?2.2.1? 生成靜態(tài)庫
2.2.1? 生成動態(tài)庫
2.2.3 動態(tài)庫和靜態(tài)庫的區(qū)別
三.? 在windows下系統(tǒng)下用DVC++編程實現(xiàn)
3.1 編輯主程序
3.2 編輯子程序
?3.3 運行效果
四.? 用CMakefile方式編程主程序
4.1 CMakefile 簡介
4.2 創(chuàng)建CMakeListss.txt
4.3?在CMakeLists.txt中添加添加可執(zhí)行文件,給sub1.c添加靜態(tài)庫,并添加鏈接
4.4 執(zhí)行 CMakeLists.txt,并查看是否生成上述文件
4.5?分別執(zhí)行連接動態(tài)庫和靜態(tài)庫的可執(zhí)行文件
五. 總結(jié)
一. 在Ubuntu系統(tǒng)下用c語言編寫一個簡單的輸出hello world 的程序,并編譯、運行。
1.1 gcc/g++簡介
? ? ? gcc/g++都是GUN開發(fā)的編譯器,前者用于對c語言程序的編譯,后者用于對c++程序的編譯。
其語法格式大同小異。
常用命令:
-E
只激活預處理,這個不生成文件,你需要把它重定向到一個輸出文件里面。例子用法:
gcc -E hello.c > pianoapan.txt
gcc -E hello.c | more
慢慢看吧,一句`hello word`也要預處理成800行的代碼。
-S
只激活預處理和編譯,就是指把文件編譯成為匯編代碼。例子用法:
gcc -S hello.c
將生成.s的匯編代碼,可以用文本編輯器查看。
-c
只激活預處理,編譯,和匯編,也就是他只把程序做成obj文件。例子用法:
gcc -c hello.c
將生成.o的目標文件(object file)。
-o
指定目標名稱,缺省的時候,gcc/g++編譯出來的文件是a.out。例子如下:
g++ -o hello.out hello.cpp
g++ -o hello.asm -S hello.cpp
目錄選項:?
-I[dir]
在你是用#include "file"的時候,gcc/g++會先在當前目錄查找你所指定的頭文件,如果沒有找到,會到系統(tǒng)默認的頭文件目錄找。如果使用-I指定了目錄,編譯器會先在指定的目錄查找,然后再去系統(tǒng)默認頭文件目錄查找。對于#include <file>,gcc/g++會到-I指定的目錄查找,查找不到,然后再到系統(tǒng)默認的頭文件目錄查找。
-include [file]
相當于“#include”,用于包含某個代碼,簡單來說,就是編譯某個文件,需要另一個文件的時候,就可以
用它設定,功能就相當于在代碼中使用#include。例子用法:
gcc hello.c -include /root/pianopan.h
-I-
就是取消前一個參數(shù)的功能,所以一般在-Idir之后使用
-idirafter [dir]
在-I的目錄里面查找失敗,將到目錄dir里面查找。
-iprefix [prefix],-iwithprefix [dir]
一般一起使用,當-I的目錄查找失敗,會到prefix+dir下查找。
-L[dir]
編譯的時候,指定搜索庫的路徑。比如你自己的庫,可以用它指定目錄,不然編譯器將只在標準庫的
目錄找。這個dir就是目錄的名稱。
-l[library]
指定編譯的時使用的庫,例子用法
gcc -lcurses hello.c
使用curses庫編譯連接,生成程序。
更多命令可在ubuntu終端中輸入 man gcc 查看
1.2 c++程序輸出 Hello World:
首先創(chuàng)建一個文件????????? 格式:? nano+文件名
在所創(chuàng)的文件中輸入c++代碼:
#include<iostream>
using namespace std;
int main()
{
cout<<"Hello World!"<<endl;
return 0;
}
退出并保存文件。
g++ a -o b?? 將a文件用c++的編譯方式編譯出名字b的可執(zhí)行文件
用g++編譯該文件
g++ Hello_World.c -o Hello_World.cpp
用 ls 查看是否生成可執(zhí)行文件,并運行。
運行Hello_World.cpp 文件
運行后輸出了? Hello World!
1.3?c語言程序輸出 Hello World:
若用c語言,需要用gcc進行編譯,語法相差不大
首先創(chuàng)建一個文本文件
在文件中輸入c語言代碼
#include <stdio.h>
int main()
{
printf("%s\n","Hello World!");
return 1;
}
保存文件,并編譯文件為可執(zhí)行文件?
查看是否生成可執(zhí)行文件
運行可執(zhí)行文件
輸出Hello World!
二. 編寫一個主程序文件main1.c和一個子程序文件sub1.c,實現(xiàn)函數(shù)間的調(diào)用
要求:子程序包含算術運算函數(shù)float? x2x(int a,int b),此函數(shù)功能對輸入兩個整數(shù)作運算,結(jié)果返回浮點數(shù);主函數(shù)定義并賦值兩個整形變量,然后調(diào)用x2x函數(shù),將結(jié)果打印出來。
思路:先編寫sub1.c程序,再將封裝為庫函數(shù),在主函數(shù)中引用sub1.c的頭文件,調(diào)用其庫函數(shù)。
2.1? 編寫sub1.c 和main1.c 函數(shù)
2.1.1 編寫sub1.c函數(shù)
#include <stdio.h>
float x2x(int a,int b)
{
float x=(float)a;
float y=(float)b;
return x/y;
}
2.1.2 編寫main1.c函數(shù),賦值a=3,b=2
#include "sub1.h"
void main()
{
int a=3,b=2;
printf("%f", x2x(3,2));
}
2.2 將sub1.c程序封裝為動態(tài)庫或者靜態(tài)庫
先將其轉(zhuǎn)為 .o 二進制文件
gcc -c sub1.c
查看是否生成sub1.o文件
2.2.1? 生成靜態(tài)庫
ar -crv lib+庫名.a? +所用程序
?當前目錄下生成libsub.a靜態(tài)庫文件
對主程序進行編譯,編譯需要用到剛才生成的庫
當前目錄生成了名為main1的可執(zhí)行文件,運行并查看結(jié)果:
輸出結(jié)果為1.500000
2.2.1? 生成動態(tài)庫
生成動態(tài)庫的方法跟靜態(tài)庫的方法類似
gcc? -shared -fPIC -o lib+庫名.so 所用程序
當前目錄下生成libsub1.so動態(tài)庫文件
用此庫將main1.c文件編譯為可執(zhí)行文件
執(zhí)行當前目錄下生成的main_1可執(zhí)行文件
同樣輸出了結(jié)果1.500000
2.2.3 動態(tài)庫和靜態(tài)庫的區(qū)別
?????? 在Linux中,庫函數(shù)分為靜態(tài)庫和動態(tài)庫兩種。靜態(tài)庫以.a作為后綴名,共享庫以.so結(jié)尾。所有庫都是一些函數(shù)打包后的集合,差別在于靜態(tài)庫每次被調(diào)用后都會生成一個副本,而動態(tài)庫則只有一個副本,更省空間。
三.? 在windows下系統(tǒng)下用DVC++編程實現(xiàn)
3.1 編輯主程序
3.2 編輯子程序
?3.3 運行效果
四.? 用CMakefile方式編程主程序
4.1 CMakefile 簡介
? ? ? ? 理論上,任意一個c語言程序都可以用gcc來編譯。但是當程序規(guī)模越來越大時,一個工程可能有許多個文件夾和源文件,這時輸入的編譯命令就越來越長。通常,一個小型的c語言項目可能含有幾十類,各類間還存在著復雜的依賴關系。其中一部分要編譯為可執(zhí)行文件。另一部分編譯成庫文件。如果僅靠gcc命令,則需要輸入大量的編譯指令,整個編譯過程會變得異常繁瑣。因此對于c項目,使用一些工程管理工具會更加高效。在歷史上,工程師們曾使用makefile進行自動編譯,但是cmake比它更加方便。并且cmake在工程上廣泛應用??傊琧make是用來管理源代碼的工具,可以對源代碼進行編譯、生成庫等。
4.2 創(chuàng)建CMakeListss.txt
CMakeLists.txt文件用來告訴cmake要對目錄下的文件做什么事情。
第一句是要求cmake編譯器的最小版本
第二句是創(chuàng)建一個工程文件名為D
4.3?在CMakeLists.txt中添加添加可執(zhí)行文件,給sub1.c添加靜態(tài)庫,并添加鏈接
?1. 將main1.c轉(zhuǎn)為名為main2的可執(zhí)行文件
2. 將main1.c轉(zhuǎn)為名為main3的可執(zhí)行文件
3. 將sub1.c封裝為名為libsub1的靜態(tài)庫
4. 將sub1.c封裝為名為libsub2的動態(tài)庫
5. 生成的main2可執(zhí)行文件與動態(tài)庫進行連接
6. 生成的main3可執(zhí)行文件與靜態(tài)庫進行連接
4.4 執(zhí)行 CMakeLists.txt,并查看是否生成上述文件
調(diào)用cmake對該工程進行cmake編譯
cmake會輸出一些編譯信息,然后再當前目錄下生成一些中間文件,其中最重要的就是MakeFile。
由于其是自動生成的,不用修改它。現(xiàn)在用make對該工程進行編譯:
查看生成的文件
?生成了main2 main3 可執(zhí)行文件,liblibsub1.a靜態(tài)庫 以及l(fā)iblibsub2.so動態(tài)庫
4.5?分別執(zhí)行連接動態(tài)庫和靜態(tài)庫的可執(zhí)行文件
運行生成的main2 和main3文件
都輸出1.500000
五. 總結(jié)
1. 在ubuntu18環(huán)境下,可以用gcc對c語言程序進行編譯和運行,用g++可以對c++語言程序進行編譯和運行。
2. ubuntu環(huán)境下用gcc編譯一個文件比較簡單,只需將程序轉(zhuǎn)為二進制可執(zhí)行文件即可,但是在運用到函數(shù)之間的調(diào)用的時候,即運用到庫時,較為復雜。
3. windows環(huán)境下對c語言的編寫和運行也是同樣的步驟,但是windows系統(tǒng)中用到的DEV C++是集成開發(fā)的軟件,比較迅速、方便。 ubuntu中也有IDE軟件,比如KDV。
4. 在執(zhí)行很多程序之間的相互調(diào)用時候,gcc生成庫較為復雜,用Makefile的方式比較簡便。
5. ubuntu中的庫分為靜態(tài)庫和動態(tài)庫,運用動態(tài)庫更加節(jié)省空間。
PS:參考資料:??g++入門教程 - 碼農(nóng)教程 (manongjc.com)文章來源:http://www.zghlxwxcb.cn/news/detail-756832.html
? ? ? ? ? ? ? ? ? ? ? ? ? 《視覺SLAM十四講從理論到實踐》第二版? 高翔 張濤 劉毅 顏沁睿 著文章來源地址http://www.zghlxwxcb.cn/news/detail-756832.html
到了這里,關于Ubuntu 用gcc/CMakefile編譯器 編譯、運行c語言程序的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!