欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何用C寫一個(gè)web服務(wù)器之GCC項(xiàng)目編譯

 更新時(shí)間:2021年05月27日 09:57:41   作者:枕邊書  
本文主要介紹了,如何用C寫一個(gè)web服務(wù)器,Linux下用GCC進(jìn)行項(xiàng)目編譯,對(duì)此感興趣的同學(xué),可以參考下。

前言

本想著接下來(lái)大概實(shí)現(xiàn)一下 CGI 協(xié)議,但是實(shí)現(xiàn)過(guò)程中被一個(gè)問(wèn)題卡住了:

C進(jìn)程與php進(jìn)程的交互數(shù)據(jù)類型問(wèn)題:

在 C 進(jìn)程中我準(zhǔn)備將服務(wù)器處理后的請(qǐng)求數(shù)據(jù)存儲(chǔ)在一個(gè)結(jié)構(gòu)體內(nèi),然后將此結(jié)構(gòu)體中的信息傳給 PHP,而 PHP 進(jìn)程內(nèi)也會(huì)有一個(gè)全局?jǐn)?shù)組與之對(duì)應(yīng),可是眾所周之,結(jié)構(gòu)體是 C 進(jìn)程內(nèi)的內(nèi)存數(shù)據(jù),是無(wú)法直接傳給 PHP 使用的。

這時(shí)候我們也需要一種“協(xié)議”來(lái)解決進(jìn)程數(shù)據(jù)類型的異構(gòu)性。當(dāng)然這個(gè)解決方案確定起來(lái)還是很簡(jiǎn)單的,無(wú)非是對(duì)C結(jié)構(gòu)體進(jìn)行序列化,使用xml,json,protobuf(沒(méi)用過(guò))之一,花費(fèi)時(shí)間多的地方在實(shí)現(xiàn)過(guò)程。 原來(lái)想自己造個(gè)輪子,實(shí)現(xiàn)一下json類型的編解碼,覺(jué)得有些偏離了主題了,于是考慮使用一個(gè)開源庫(kù)cJSON;

可是自己沒(méi)有過(guò) C 大型項(xiàng)目的開發(fā)經(jīng)驗(yàn),寫的都是小 demo,gcc -o name source.c 足以解決問(wèn)題了,沒(méi)有過(guò)編譯多個(gè)文件、組織項(xiàng)目的經(jīng)驗(yàn),下載到源碼后一臉懵逼,搜索到的編譯資料都是一些較為零散的內(nèi)容,不成體系,不過(guò)在自己的多次嘗試下終于成功地將 cJSON 引入到項(xiàng)目中了,這里稍做一下總結(jié)。

繞了好久,終于來(lái)到了本篇文章的主題:項(xiàng)目編譯,主要介紹一些用 GCC 在 linux 下項(xiàng)目編譯鏈接的步驟。

編譯步驟

先說(shuō)一下一個(gè)C源文件的編譯一般步驟:

1.預(yù)處理(preprocess):主要是在代碼層面的處理,包括文件的引入,展開宏定義,刪除注釋,添加行號(hào)等,生成的文件以.i結(jié)尾。

gcc -E test.c -o test.i

2.編譯(compilation):編譯是在代碼語(yǔ)法層面的處理,生成對(duì)應(yīng)的匯編語(yǔ)言代碼,生成以.s為后綴的匯編語(yǔ)言文件;

gcc -S test.i -o test.s

3.匯編(Assembly):將匯編語(yǔ)言代碼生成可執(zhí)行的機(jī)器碼,生成以.o為后綴的目標(biāo)文件。

gcc -c test.s -o test.o

4.鏈接(Linking):將各個(gè).o目標(biāo)文件連接起來(lái),并解決庫(kù)依賴,生成無(wú)后綴的可直接執(zhí)行文件。

gcc -o test test.o

如果我們直接使用后面的命令,那么前面的步驟也會(huì)自動(dòng)執(zhí)行。如我們常使用的 gcc -o 實(shí)際上是一次性完成了所有的步驟的。

以上的中間文件,大家可以使用文本查看工具來(lái)查看其中內(nèi)容來(lái)驗(yàn)證其功能。

靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)

庫(kù)文件有動(dòng)態(tài)和靜態(tài)之分,他們的命名規(guī)范為 lib庫(kù)名.后綴,在鏈接目標(biāo)文件和庫(kù)時(shí),使用 -l 庫(kù)名(空格可省略)選項(xiàng),也可以添加-L /path來(lái)規(guī)定優(yōu)先搜索庫(kù)文件的目錄。

例如:C中的數(shù)學(xué)函數(shù)庫(kù)math.h的動(dòng)態(tài)庫(kù)文件名為libm.so,那么我們編譯連接文件時(shí)就需要添加-lm的選項(xiàng)。如果要指定庫(kù)文件路徑為/usr/lib64/libm.so,那么可添加-L /usr/lib64來(lái)指定庫(kù)文件優(yōu)先查找目錄。

另外靜態(tài)和動(dòng)態(tài)庫(kù)文件搜索目錄順序不一樣,下面分別詳細(xì)介紹:

靜態(tài)庫(kù)

靜態(tài)庫(kù)文件一般是以.a為后綴的庫(kù)文件,它在編譯連接時(shí)會(huì)將庫(kù)文件的內(nèi)容全部添加到可執(zhí)行文件中,在編譯連接完成后,靜態(tài)庫(kù)文件便不再影響可執(zhí)行文件。

它的優(yōu)點(diǎn)是簡(jiǎn)單粗暴,但如果庫(kù)文件內(nèi)部有改動(dòng)的話需要重新對(duì)所有引用此庫(kù)文件的可執(zhí)行文件重新編譯。

一般編譯步驟如下:

gcc -c static.c -o static.o // 編譯靜態(tài)庫(kù)文件的源文件
ar -r static.a static.o // 生成靜態(tài)庫(kù)文件
gcc -o main -lstatic // 連接靜態(tài)庫(kù)文件生成可執(zhí)行文件

編譯連接時(shí),靜態(tài)庫(kù)文件搜索目錄順序?yàn)椋?/p>

1.編譯連接時(shí) -L 參數(shù)指定的目錄;

2.環(huán)境變量目錄 LIBRARY_PATH;

3.固定目錄 /lib、/usr/lib、/usr/local/lib等;

動(dòng)態(tài)庫(kù)

動(dòng)態(tài)庫(kù)文件一般以.so結(jié)尾,它在編譯連接時(shí)只把動(dòng)態(tài)庫(kù)的文件添加到可執(zhí)行文件,只在程序運(yùn)行時(shí)才加載庫(kù)文件。這種方式的優(yōu)點(diǎn)是非常靈活,如果動(dòng)態(tài)庫(kù)文件內(nèi)部有變動(dòng),那么只需重要重新編譯庫(kù)文件即可。

它的一般編譯步驟如下:

gcc -c dynamic.c -fpic -o dynamic.o // 編譯動(dòng)態(tài)庫(kù)文件的源文件 -fpic 表示編譯為位置獨(dú)立的代碼,使之可以被放在可執(zhí)行文件內(nèi)存中的任何地方
gcc -shared dynamic.o -o dynamic.so // 生成動(dòng)態(tài)庫(kù)文件
gcc -o main -L . -ldynamic // 連接當(dāng)前文件夾下的動(dòng)態(tài)庫(kù)文件

編譯連接時(shí),動(dòng)態(tài)庫(kù)文件搜索目錄順序?yàn)椋?/p>

1.編譯連接時(shí) -L 參數(shù)指定目錄;

2.環(huán)境變量目錄 LD_LIBRARY_PATH;

3.配置文件/etc/ld.so.conf中配置的目錄

4.固定目錄 /lib、/usr/lib等。

CMakeLists

寫到這里還不是結(jié)尾,我們要考慮如果文件非常多怎么辦,難道每一次都要輸入n多個(gè)源文件名嗎?如果軟件完成后,用戶使用時(shí)可不想記住這些復(fù)雜的命令和文件。

自動(dòng)化才是目標(biāo),我們考慮使用自動(dòng)化編譯工具 cmake,那么接下來(lái)我們就要編寫適合項(xiàng)目文件的編譯配置文件 CMakeLists。

CMakeLists 是一個(gè) txt 文件,它就像是項(xiàng)目的編譯指南,是給用 cmake 工具用的。其語(yǔ)法類似于 shell,但內(nèi)置了許多函數(shù),這里我們介紹幾個(gè)簡(jiǎn)單的語(yǔ)法,編寫一個(gè)簡(jiǎn)單的 CMakeLists.txt。

當(dāng)前文件結(jié)構(gòu):

|__ CMakeLists.txt

    |__ test.c

    |__ cJSON.c

    |__ include

    |   |__ cJSON.h

    |__ lib

下面是一個(gè)動(dòng)態(tài)庫(kù)的編譯CmakeList,將解釋放在注釋中。

PROJECT(test)  # 項(xiàng)目名稱
cmake_minimum_required(VERSION 2.8) # 選擇一個(gè)cmake版本

SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) # 設(shè)定產(chǎn)生庫(kù)的目錄
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) # 設(shè)定產(chǎn)生的可執(zhí)行文件的目錄

ADD_EXECUTABLE(test test.c) # 這里要先聲明產(chǎn)生的可執(zhí)行文件,以便后面連接

SET(cJSON cJSON.c)  # 設(shè)置文件變量
ADD_LIBRARY(cJSON SHARED ${cJSON}) # 此語(yǔ)句用文件變量生成一個(gè)動(dòng)態(tài)鏈接庫(kù)
TARGET_LINK_LIBRARIES(test cJSON) # 連接可執(zhí)行文件與動(dòng)態(tài)鏈接庫(kù)

FIND_LIBRARY(MATH_LIB libm.so /usr/lib64)  # 在/usr/lib64文件夾下找libm.so(cJSON需要)
IF(MATH_LIB)
    TARGET_LINK_LIBRARIES(test ${MATH_LIB}) # 找到之后連接上
ENDIF()

MESSAGE("cmake complete, use make to compile!") # 在命令行輸出提示語(yǔ)句

運(yùn)行 cmake . && make完成項(xiàng)目的構(gòu)建。

此時(shí)的目錄結(jié)構(gòu)為(略過(guò)了 cmake 產(chǎn)生的臨時(shí)文件):

|__ CMakeLists.txt

    |__ test.c

    |__ cJSON.c

    |__ include

    |   |__ cJSON.h

    |__ lib

    |   |__ libcJSON.so

    |__ bin

        |__ test

以上就是如何用C寫一個(gè)web服務(wù)器之GCC項(xiàng)目編譯的詳細(xì)內(nèi)容,更多關(guān)于用C寫一個(gè)web服務(wù)器之GCC項(xiàng)目編譯的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語(yǔ)言 structural body結(jié)構(gòu)體詳解用法

    C語(yǔ)言 structural body結(jié)構(gòu)體詳解用法

    C 數(shù)組允許定義可存儲(chǔ)相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許您存儲(chǔ)不同類型的數(shù)據(jù)項(xiàng),結(jié)構(gòu)用于表示一條記錄,假設(shè)您想要跟蹤圖書館中書本的動(dòng)態(tài),您可能需要跟蹤每本書的下列屬性
    2021-10-10
  • 一文搞懂C++11萬(wàn)能引用和右值引用

    一文搞懂C++11萬(wàn)能引用和右值引用

    本文主要介紹了C++11萬(wàn)能引用和右值引用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語(yǔ)言指針基礎(chǔ)知識(shí)實(shí)例講解

    C語(yǔ)言指針基礎(chǔ)知識(shí)實(shí)例講解

    這篇文章主要介紹了C語(yǔ)言指針基本知識(shí)實(shí)例講解,文中實(shí)例講解的很清晰,有不太懂的同學(xué)可以研究下
    2021-02-02
  • C語(yǔ)言模擬實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)

    C語(yǔ)言模擬實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言模擬實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C++14 新特性之函數(shù)返回值類型推導(dǎo)

    C++14 新特性之函數(shù)返回值類型推導(dǎo)

    本文主要介紹了C++14 新特性之函數(shù)返回值類型推導(dǎo),在模板編程和一些返回類型復(fù)雜或不易直接指明的情況下非常有用,下面就來(lái)具體介紹一下,感興趣的可以了解一下
    2024-05-05
  • C語(yǔ)言實(shí)現(xiàn)掃雷游戲(可以自動(dòng)展開)

    C語(yǔ)言實(shí)現(xiàn)掃雷游戲(可以自動(dòng)展開)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷游戲,可以自動(dòng)展開,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C語(yǔ)言實(shí)現(xiàn)獲取文件MD5值

    C語(yǔ)言實(shí)現(xiàn)獲取文件MD5值

    MD5(Message?Digest?Algorithm?5)是一種常用的哈希函數(shù)算法,這篇文章主要介紹了C語(yǔ)言如何獲取文件MD5值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08
  • C++計(jì)算每個(gè)字符出現(xiàn)的次數(shù)

    C++計(jì)算每個(gè)字符出現(xiàn)的次數(shù)

    這篇文章主要介紹了C++計(jì)算每個(gè)字符出現(xiàn)的次數(shù)的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • C語(yǔ)言中格式化輸出符號(hào)%d、%c、%p、%x等詳解

    C語(yǔ)言中格式化輸出符號(hào)%d、%c、%p、%x等詳解

    格式化輸出在C語(yǔ)言中非常常用,提供了多種用法來(lái)控制輸出的格式,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中格式化輸出符號(hào)%d、%c、%p、%x等的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • C語(yǔ)言實(shí)現(xiàn)單詞小幫手

    C語(yǔ)言實(shí)現(xiàn)單詞小幫手

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)單詞小幫手,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10

最新評(píng)論