(二)掌握最基本的Linux服務器用法——Linux下簡單的C/C++ 程序、項目編譯

1、靜態庫與動態庫?

?

?靜態庫(Static Library):靜態庫是編譯后的庫文件,其中的代碼在編譯時被鏈接到程序中,因此它會與程序一起形成一個獨立的可執行文件。每個使用靜態庫的程序都會有自己的庫的副本,這可能會導致內存浪費。常用后綴名(.a)
優點:
·獨立性:庫的代碼會被靜態地鏈接到程序中,使程序變得獨立并能夠單獨運行。
·版本控制:庫的代碼被嵌入在程序中,不受外部庫版本的影響。
缺點:
·內存浪費:每個使用靜態庫的程序都會擁有庫的一個副本,可能導致內存浪費。
·更新困難:更新庫需要重新編譯整個程序,部署和維護會相對復雜。

動態庫(Dynamic Library):是編譯后的庫文件,其代碼在程序運行時由操作系統加載到內存中。
多個程序可以共享同一個動態庫的實例,從而減少內存占用并提高程序的執行效率。動態庫文件通常具有.so(Shared Object)后綴名,是一種在運行時動態加載的共享組件。
優點:
內存效率:多個程序可以共享同一個庫文件的實例,減少內存使用。
更新和維護:庫的更新只需替換庫文件,不需要重新編譯整個程序。
靈活性:程序可以動態加載和卸載庫,提高程序的靈活性和可維護性。
缺點:
運行時依賴:程序在運行時需要動態庫的支持,如果缺少庫文件,程序將無法運行。
部署復雜性:需要確保目標系統上有正確版本的動態庫。

2、軟件源碼編譯與安裝

檢查編譯工具:
在開始編譯之前,確保系統中已安裝了編譯所需的工具,如編譯器(例如gcc)、構建工具(如make)和開發庫(如libc)等。可以通過包管理工具安裝這些工具。
配置編譯選項:
進入源代碼目錄,運行配置腳本以配置編譯選項。通常,可以使用 ./configure命令來配置,但一些軟件可能有自己的配置腳本。您可以使用不同的選項來啟用或禁用功能、指定安裝路徑等。
編譯源代碼:
運行make命令來編譯源代碼。這將生成可執行文件和其他必要的文件。這一步很關鍵。
安裝軟件:
運行sudo make install命令以將編譯后的文件安裝到系統中。這將把文件復制到系統的標準安裝路徑,通常為/usr/local。
如果感興趣,可以從網上找一些簡單的安裝的安裝包試一試。

3、C與C++編譯過程

編譯過程、各種文件、

gcc相關

使用gcc來編譯:

方法一、使用gcc單步生成
#預處理,生成中間文件(.i)
????????gcc ?-E ?source.c -o ?source.i
#編譯,生成匯編代碼(.s)
????????gcc -s source.i -o source.s
#匯編,生成目標文件(.o)
????????gcc -c source.s -o source.o
#鏈接,生成可執行文件
????????gcc source.o -o my_program
方法二、使用gcc保留中間編譯結果
gcc ?-save-temps ?source.c ?-o ? my_program

gcc的常用編譯選項

完整的gcc用法可以通過man gcc命令進行查看

頭文件路徑選項:
????????-I:指定頭文件的搜索路徑。
多線程選項:
????????-pthread:啟用POSIX線程支持。
代碼生成選項:
????????-fPIC:生成位置無關代碼。
????????-fno-stack-protector: 禁用棧保護。
????????-fno-exceptions: 禁用C++異常處理
編譯目標架構選項:
????????-march:指定目標架構,如-march=native。
????????-m32:編譯為32位目標。
????????-m64:編譯為64位目標。

?警告相關:

—Wall: 開啟大部分警告
—Werror:將警告視為錯誤


gcc使用方法進階-靜態庫和動態庫的創建:

1、創建靜態庫的基本步驟:
????????1、編譯源文件生成目標文件(.o文件):
????????gcc -c file1.c file2.c
????????2、創建靜態庫:
????????ar rcs libmylib.a file1.o file2.o
2、創建動態庫的基本步驟:
????????1、編譯源文件生成位置無關的目標文件:
????????gcc-fPIC-c file1.c file2.c
????????2、創建動態庫:
????????gcc -shared -o libmylib.so file1.o file2.o
????????注意,創建動態庫時需要加上-PIC選項,以生成位置無關的代碼,以便在不同的內存地址中加載。

4、make命令

make是一個自動化構建工具,用于管理源代碼的編譯和構建過程。它可以根據規則和依賴關系自動確定哪些文件需要重新編譯,從而使整個構建過程更加高效和自動化。make使用一個名為Makefile的文本文件來描述編譯和構建規則。

Makefile文件:

Makefile定義了如何編譯源代碼、如何生成目標文件以及如何生成最終的可執行文件或庫。Makefile使用一種類似于腳本的語法,其中包含了目標、依賴關系和命令。

Makefile基礎:
????????目標(Target):目標是Makefile中的一個名稱,表示您要構建的文件或操作。目標可以是可執行文件、庫文件、偽目標(用于執行特定操作,如清理文件)等。
????????依賴關系(Dependencies): ?每個目標可以有零個或多個依賴關系,表示生成該目標所需的其他文件或目標。依賴關系告訴make哪些文件在構建目標之前需要被更新或重新生成。
????????規則(Ruls):規則定義了如何從依賴關系生成目標文件的過程。規則包括目標、依賴關系和構建命令。
????????命令(Commands):命令是在規則中定義的一系列操作步驟,用于從依賴關系生成目標。命令通常以Tab開頭,并列出了實際的編譯、鏈接等操作。
????????變量(Variables):變量用于存儲和傳遞值,使Makefile更具可維護性。您可以使用變量來存儲編譯器選項、源文件列表等。
????????注釋(Comments):注釋用于向Makefile添加說明,以便其他人理解構建過程和規則。

Makefile內容例如:

CC=gcc
CFLAGS =-Wall
myprogram: main.c ? utils.c$(CC)$(CFLAGS)-o myprogram main.c
utils.c
clean:rm -f myprogram?

make常用命令:

make-f: 用于指定一個不同于默認名稱的Makefile文件來執行構建操作。
make-j N:使用多個并行任務進行構建,其中N是并行任務的數量。例如make-j4將使用4
個任務并行構建。
make-C ?dir:在指定的目錄中執行make命令。例如make-C src將在src目錄中執行構建。
make -B或make --always-make:強制重新構建目標,即使目標已經是最新的。這在需要強制重新構建的情況下很有用。

cmake、gmake、qmake:

CMake(需要安裝)是一個跨平臺的構建工具,用于生成用于不同編譯器和操作系統的構建文件(如Makefile、Visual Studio項目等)。使用一種類似腳本的語言來描述項目的構建過程,并生成相應的構建文件。CMake的一個主要優勢是可以生成多種不同編譯系統所需的構建文件。
gmake(GNU make)在不同的操作系統中也存在,但其Makefile文件在不同的平臺上可能需要進行修改才能適應不同的編譯器和操作系統。
qmake是Qt框架附帶的構建工具,用于生成Qt項目的構建文件。它使用.pro文件來描述項目的配置和構建規則。qmake可以生成Makefile或Visual Studio項目文件,以便在不同平臺上構建Qt項目。

5、軟件編譯過程中常見錯誤

????????依賴問題:缺少所需的依賴庫或工具,導致編譯過程失敗。解決方法包括安裝缺失的依賴、更新版本,或者指定正確的依賴路徑。
????????編譯器錯誤:編譯器報錯或警告,可能由于語法錯誤、類型不匹配等問題。解決方法涉及修改源代碼以修復問題,確保代碼符合編譯器規范。
????????庫路徑問題:編譯器找不到所需的庫文件,可能是因為庫路徑未正確配置。解決方法包括指定正確的庫路徑、更新庫鏈接等。
????????版本不兼容:編譯代碼可能與特定版本的庫、編譯器或操作系統不兼容。解決方法可能涉及更新或降級軟件,以滿足兼容性要求。
????????文件缺失或損壞:源代碼或依賴文件可能缺失、損壞或下載不完整,導致編譯失敗。解決方法包括重新下載文件、修復文件損壞等 。

……

6、conda基本概念介紹

conda是一個開源的包管理和環境管理工具,主要用于數據科學、機器學習和科學計算等領域。允許用戶輕松創建、管理和分享不同的虛擬環境,以及安裝和管理不同版本的軟件包和庫。
conda最初是Anaconda發行版中的一部分,后來作為一個獨立的工具被廣泛使用。


1.包版本管理:conda允許用戶安裝特定版本的軟件包,并可以在不同版本之間切換。這對于確保項目在不同環境和平臺上的一致性非常有用。
2.環境管理:conda支持創建和管理獨立的虛擬環境。每個環境都可以有自己的依賴、配置和Python版本。這使得在同一臺機器上同時管理多個項目變得更加容易。
3.虛擬環境集成:conda可以創建和管理虛擬環境,但也可以與其他虛擬環境工具(如virtualenv)集成,以提供更大的靈活性。

conda的基本命令:
創建虛擬環境:conda ?create ?--name ?myenv
激活虛擬環境或進入虛擬環境:conda activate ?myenv

在虛擬環境中安裝軟件包:conda install numpy
列出已安裝的軟件包:conda list
卸載軟件包:conda remove numpy
退出虛擬環境:conda deactivate

刪除虛擬環境:先執行退出虛擬環境的命令,再執行conda env remove --name 虛擬環境名。
創建環境配置文件:conda env export > environment.yml
從配置文件創建環境:conda env create -f environment.yml

我創建的虛擬環境的路徑:/home/服務器名稱/anaconda3/envs/環境名稱
可以通過conda-help或conda<subcommand>-help查看更詳細的幫助信息?

與此相似的,virtualenv是一個非常有用的工具,特別適用于多項目開發環境中,它通過隔離環境、管理依賴和提供獨立的Python版本等功能,使得Python項目開發更加靈活、可靠和可維護。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41730.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41730.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41730.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

opencv簡單使用

cv2庫安裝&#xff0c; conda install opencv-python注意cv2使用時&#xff0c;路徑不能有中文。&#xff08;不然會一直’None’ _ update # 處理中文路徑問題 def cv_imread(file_path): #使用之前需要導入numpy、cv2庫&#xff0c;file_path為包含中文的路徑return cv2.imd…

idea入門與maven配置的一些介紹

idea入門與maven配置的一些介紹 1.確保Java和Maven已安裝2.創建一個新的Maven項目3.導航到要創建項目的目錄配置Maven4.配置項目的pom.xml文件5.配置其他Tomcat和設置jdk6.構建和運行項目 關于idea入門基礎配置 步驟1&#xff1a;安裝IntelliJ IDEA 首先&#xff0c;從IntelliJ…

腳本語言與編譯語言的區別

文章目錄 一、語法差異二、執行方式差異三、應用領域差異四、總結 一、語法差異 腳本語言&#xff1a;腳本語言通常使用解釋器逐行執行&#xff0c;不需要事先編譯。它的語法相對簡單&#xff0c;易于學習和使用。常見的腳本語言有Python、JavaScript和Ruby等。 編譯語言&…

上海市青少年算法2023年2月月賽(丙組)

上海市青少年算法2023年2月月賽(丙組)T1 格式改寫 題目描述 給定一個僅由拉丁字符組成字符序列,需要改寫一些字符的大小寫,使得序列全部變成大寫或全部變成小寫,請統計最少修改多少個字符才能完成這項任務。 輸入格式 一個字符序列:保證僅由拉丁字符構成 輸出格式 單個整…

golang環境搭建

1. 下載、安裝 wget -O go.tar.gz https://golang.google.cn/dl/go1.21.0.linux-amd64.tar.gz sudo rm -rf /usr/local/go && sudo tar -zxvf go.tar.gz -C /usr/local2.創建工作目錄 cd mkdir -p go/{bin,pkg,src}3.添加環境變量 sudo vim /etc/profile寫入以下…

計算機競賽 python+大數據校園卡數據分析

0 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度學習車牌識別系統實現 &#x1f947;學長這里給一個題目綜合評分(每項滿分5分) 難度系數&#xff1a;4分工作量&#xff1a;4分創新點&#xff1a;3分 該項目較為新穎&am…

記錄一個編譯TubeTK時的報錯:at_check問題

在使用如下命令安裝TubeTK的cuda_nms時&#xff0c;報了一個錯誤&#xff0c;記錄一下這個錯誤和解決辦法 (base) redmeryredmery:~/Desktop/MOT/TubeTK/post_processing/nms$ python setup.py build_ext --inplace因為這個命令是在/home/redmery/Desktop/MOT/TubeTK/install/…

Talk | ACL‘23 杰出論文獎上海交通大學吳蔚琪:預訓練語言模型對本體知識的記憶與理解

本期為TechBeat人工智能社區第523期線上Talk&#xff01; 北京時間8月17日(周四)20:00&#xff0c;上海交通大學碩士研究生—吳蔚琪的Talk已準時在TechBeat人工智能社區開播&#xff01; 她與大家分享的主題是: “預訓練語言模型對本體知識的記憶與理解”&#xff0c;分享了預訓…

Python入門【TCP建立連接的三次握手、 TCP斷開連接的四次揮手、套接字編程實戰、 TCP編程的實現、TCP雙向持續通信】(二十七)

&#x1f44f;作者簡介&#xff1a;大家好&#xff0c;我是愛敲代碼的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列專欄&#xff1a;python入門到實戰、Python爬蟲開發、Python辦公自動化、Python數據分析、Python前后端開發 &#x1f4e7;如果文章知識點有錯誤…

【c語言】通訊錄(動態版+文件+背景音樂)含源碼

開飯了&#xff0c;之前寫的通訊錄&#xff0c;是否會有人覺得申請1000人的空間是不是有點用不上呀&#xff0c;怎么才能做到要多少申請多少個呢&#xff1f;&#xff1f;我們學完動態內存管理&#xff0c;和文件的相關操作&#xff0c;終于可以繼續完善我們的通訊錄了 船新版本…

機器學習基礎(三)

邏輯回歸 場景 垃圾郵件分類 預測腫瘤是良性還是惡性 預測某人的信用是否良好 正確率與召回率 正確率與召回率(Precision & Recall)是廣泛應用于信息檢索和統計學分類領域的兩個度量值,用來評價結果的質量。 一般來說,正確率就是檢索出來的條目有多少是正確的,召回率就…

salesforce創建定時任務時明明implements the Schedulable interface卻提示不是的解決方法

Apex類&#xff1a; global class TimesheetWeeklyJob implements Schedulable{global void execute( SchedulableContext SC ) {WeeklyTimesheetProcess.markSubmitted();WeeklyTimesheetProcess.createNewSheets();} }卻提示&#xff1a; Error: You must select an Apex cl…

數據結構:二叉樹的遞歸實現(C實現)

個人主頁 &#xff1a; 個人主頁 個人專欄 &#xff1a; 《數據結構》 《C語言》 文章目錄 前言一、樹的概念二、二叉樹二叉樹的概念二叉樹的性質 三、二叉樹鏈式結構實現二叉樹節點定義創建二叉樹節點遍歷二叉樹先序遍歷二叉樹(BinaryTreePrevOrder)中序遍歷二叉樹(BinaryTree…

Air780EG —— 合宙4G定位解決方案

定位模式&#xff1a; 外部單片機控制模式(常見于AT固件客戶)&#xff1a; 開機 -> 搜星 -> 定位成功 -> 上報 -> 關機 780E自行控制模式(常見于二次開發客戶&#xff0c;AT用戶也可以使用): 開機 -> 搜星 -> 定位成功 -> 模塊休眠&#xff0c;關閉GP…

億發創新中醫藥信息化解決方案,自動化煎煮+調劑,打造智能中藥房

傳統中醫藥行業逐步復興&#xff0c;同時互聯網科技和人工智能等信息科技助力中醫藥行業逐步實現數字化轉型。利用互聯網、物聯網、大數據等科技&#xff0c;實現現代科學與傳統中醫藥的結合&#xff0c;提供智能配方顆粒調配系統、中藥自動化調劑系統、中藥煎配智能管理系統、…

【從零學習python 】40.python魔法方法(一)

文章目錄 魔法方法1. __init__ 方法2. __del__ 方法3. __str__ 方法4. __repr__ 方法5. __call__ 方法進階案例 魔法方法 Python 里有一種方法&#xff0c;叫做魔法方法。Python 的類里提供的&#xff0c;兩個下劃線開始&#xff0c;兩個下劃線結束的方法&#xff0c;就是魔法…

如何切換goland之中的版本號(升級go 到1.20)

go 安裝/版本切換_go 切換版本_云滿筆記的博客-CSDN博客 用brew就行&#xff1a; echo export PATH"/opt/homebrew/opt/go1.20/bin:$PATH" >> ~/.zshrc

[國產MCU]-BL602開發實例-OLED-SSD1306驅動與U8g2移植

OLED-SSD1306驅動與U8g2移植 文章目錄 OLED-SSD1306驅動與U8g2移植1、OLED介紹2、SSD1306介紹2、U8g2介紹3、U8g2移植3.1 定義U8g2圖形庫的移植函數3.2 移植函數實現3.3 移植函數調用4、驅動測試本文將詳細介紹如何在BL602中移植U8g2圖形庫,并通過U8g2庫驅動OLED SSD1306顯示屏…

Linux6.40 Kubernetes 配置資源管理

文章目錄 計算機系統5G云計算第三章 LINUX Kubernetes 配置資源管理一、Secret1.Secret 四種類型1&#xff09;kubernetes.io/service-account-token2&#xff09;Opaque3&#xff09;kubernetes.io/dockerconfigjson4&#xff09;kubernetes.io/tls 2.Pod 需要先引用才能使用某…