返回顶部
首页 > 资讯 > 服务器 >如何用C写一个web服务器之GCC项目编译
  • 355
分享到

如何用C写一个web服务器之GCC项目编译

2024-04-02 19:04:59 355人浏览 泡泡鱼
摘要

目录前言编译步骤静态库和动态库静态库动态库CMakeLists前言 本想着接下来大概实现一下 CGI 协议,但是实现过程中被一个问题卡住了: C进程与PHP进程的交互数据类型问题:

前言

本想着接下来大概实现一下 CGI 协议,但是实现过程中被一个问题卡住了:

C进程与PHP进程的交互数据类型问题:

在 C 进程中我准备将服务器处理后的请求数据存储在一个结构体内,然后将此结构体中的信息传给 php,而 PHP 进程内也会有一个全局数组与之对应,可是众所周之,结构体是 C 进程内的内存数据,是无法直接传给 PHP 使用的。

这时候我们也需要一种“协议”来解决进程数据类型的异构性。当然这个解决方案确定起来还是很简单的,无非是对C结构体进行序列化,使用xml,JSON,protobuf(没用过)之一,花费时间多的地方在实现过程。 原来想自己造个轮子,实现一下json类型的编解码,觉得有些偏离了主题了,于是考虑使用一个开源库cJSON;

可是自己没有过 C 大型项目开发经验,写的都是小 demo,GCc -o name source.c 足以解决问题了,没有过编译多个文件、组织项目的经验,下载到源码后一脸懵逼,搜索到的编译资料都是一些较为零散的内容,不成体系,不过在自己的多次尝试下终于成功地将 cJSON 引入到项目中了,这里稍做一下总结

绕了好久,终于来到了本篇文章的主题:项目编译,主要介绍一些用 GCC 在 linux 下项目编译链接的步骤。

编译步骤

先说一下一个C源文件的编译一般步骤:

1.预处理(preprocess):主要是在代码层面的处理,包括文件的引入,展开宏定义,删除注释,添加行号等,生成的文件以.i结尾。

gcc -E test.c -o test.i

2.编译(compilation):编译是在代码语法层面的处理,生成对应的汇编语言代码,生成以.s为后缀的汇编语言文件;

gcc -S test.i -o test.s

3.汇编(Assembly):将汇编语言代码生成可执行的机器码,生成以.o为后缀的目标文件。

gcc -c test.s -o test.o

4.链接(Linking):将各个.o目标文件连接起来,并解决库依赖,生成无后缀的可直接执行文件。

gcc -o test test.o

如果我们直接使用后面的命令,那么前面的步骤也会自动执行。如我们常使用的 gcc -o 实际上是一次性完成了所有的步骤的。

以上的中间文件,大家可以使用文本查看工具来查看其中内容来验证其功能。

静态库和动态库

库文件有动态和静态之分,他们的命名规范为 lib库名.后缀,在链接目标文件和库时,使用 -l 库名(空格可省略)选项,也可以添加-L /path来规定优先搜索库文件的目录。

例如:C中的数学函数库math.h的动态库文件名为libm.so,那么我们编译连接文件时就需要添加-lm的选项。如果要指定库文件路径为/usr/lib64/libm.so,那么可添加-L /usr/lib64来指定库文件优先查找目录。

另外静态和动态库文件搜索目录顺序不一样,下面分别详细介绍:

静态库

静态库文件一般是以.a为后缀的库文件,它在编译连接时会将库文件的内容全部添加到可执行文件中,在编译连接完成后,静态库文件便不再影响可执行文件。

它的优点是简单粗暴,但如果库文件内部有改动的话需要重新对所有引用此库文件的可执行文件重新编译。

一般编译步骤如下:


gcc -c static.c -o static.o // 编译静态库文件的源文件
ar -r static.a static.o // 生成静态库文件
gcc -o main -lstatic // 连接静态库文件生成可执行文件

编译连接时,静态库文件搜索目录顺序为:

1.编译连接时 -L 参数指定的目录;

2.环境变量目录 LIBRARY_PATH;

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

动态库

动态库文件一般以.so结尾,它在编译连接时只把动态库的文件添加到可执行文件,只在程序运行时才加载库文件。这种方式的优点是非常灵活,如果动态库文件内部有变动,那么只需重要重新编译库文件即可。

它的一般编译步骤如下:


gcc -c dynamic.c -fpic -o dynamic.o // 编译动态库文件的源文件 -fpic 表示编译为位置独立的代码,使之可以被放在可执行文件内存中的任何地方
gcc -shared dynamic.o -o dynamic.so // 生成动态库文件
gcc -o main -L . -ldynamic // 连接当前文件夹下的动态库文件

编译连接时,动态库文件搜索目录顺序为:

1.编译连接时 -L 参数指定目录;

2.环境变量目录 LD_LIBRARY_PATH;

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

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

CMakeLists

写到这里还不是结尾,我们要考虑如果文件非常多怎么办,难道每一次都要输入n多个源文件名吗?如果软件完成后,用户使用时可不想记住这些复杂的命令和文件。

自动化才是目标,我们考虑使用自动化编译工具 cmake,那么接下来我们就要编写适合项目文件的编译配置文件 CMakeLists。

CMakeLists 是一个 txt 文件,它就像是项目的编译指南,是给用 cmake 工具用的。其语法类似于 shell,但内置了许多函数,这里我们介绍几个简单的语法,编写一个简单的 CMakeLists.txt。

当前文件结构:

|__ CMakeLists.txt

    |__ test.c

    |__ cJSON.c

    |__ include

    |   |__ cJSON.h

    |__ lib

下面是一个动态库的编译CmakeList,将解释放在注释中。


PROJECT(test)  # 项目名称
cmake_minimum_required(VERSION 2.8) # 选择一个cmake版本

SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) # 设定产生库的目录
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) # 设定产生的可执行文件的目录

ADD_EXECUTABLE(test test.c) # 这里要先声明产生的可执行文件,以便后面连接

SET(cJSON cJSON.c)  # 设置文件变量
ADD_LIBRARY(cJSON SHARED ${cJSON}) # 此语句用文件变量生成一个动态链接库
TARGET_LINK_LIBRARIES(test cJSON) # 连接可执行文件与动态链接库

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!") # 在命令行输出提示语句

运行 cmake . && make完成项目的构建。

此时的目录结构为(略过了 cmake 产生的临时文件):

|__ CMakeLists.txt

    |__ test.c

    |__ cJSON.c

    |__ include

    |   |__ cJSON.h

    |__ lib

    |   |__ libcJSON.so

    |__ bin

        |__ test

以上就是如何用C写一个WEB服务器之GCC项目编译的详细内容,更多关于用C写一个web服务器之GCC项目编译的资料请关注编程网其它相关文章!

--结束END--

本文标题: 如何用C写一个web服务器之GCC项目编译

本文链接: https://lsjlt.com/news/126931.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何用C写一个web服务器之GCC项目编译
    目录前言编译步骤静态库和动态库静态库动态库CMakeLists前言 本想着接下来大概实现一下 CGI 协议,但是实现过程中被一个问题卡住了: C进程与php进程的交互数据类型问题: ...
    99+
    2024-04-02
  • 怎么用C写一个web服务器之GCC项目编译
    这篇文章给大家分享的是有关怎么用C写一个web服务器之GCC项目编译的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言本想着接下来大概实现一下 CGI 协议,但是实现过程中被一个问题卡住了:C进程与php进程的交...
    99+
    2023-06-15
  • 如何用C写一个web服务器之CGI协议
    目录前言CGICGI请求CGI响应Nginx和PHP的CGI实现SAPIPHP-FPM纠偏代码实现http_parsercJSON前言 这次更新主要实现一下 CGI 协议。 先放上G...
    99+
    2024-04-02
  • 如何用C写一个web服务器之基础功能
    目录服务器架构目标架构当前状态功能实现socket系列方法服务器与 PHP cli 交互报文数据处理服务器架构 目标架构 以 nginx 的思想来考虑本服务器架构,初步考虑如下图: ...
    99+
    2024-04-02
  • 如何用C写一个web服务器之I/O多路复用
    目录前言I/O模型select/poll/epollepoll介绍epoll_createepoll_ctlepoll_waitepoll行为代码实现整体处理逻辑设置epoll ET...
    99+
    2024-04-02
  • 怎么用C写一个web服务器之基础功能
    这篇文章给大家分享的是有关怎么用C写一个web服务器之基础功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。服务器架构目标架构以 nginx 的思想来考虑本服务器架构,初步考虑如下图:当然 php 进程也可以替换...
    99+
    2023-06-15
  • 如何用C#编写一个Windows服务程序
    今天小编给大家分享一下如何用C#编写一个Windows服务程序的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。添加引用Wind...
    99+
    2023-07-05
  • 怎么用C写一个web服务器之I/O多路复用
    小编给大家分享一下怎么用C写一个web服务器之I/O多路复用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言I/O模型接触过 socket 编程的同学应该都知道...
    99+
    2023-06-15
  • 基于C++编写一个简单的服务器
    本文使用上一期写的反射类,另外我发现<WinSock2.h>这个头文件里有RegisterClass 这个结构,还有typedef RegisterClass Regis...
    99+
    2023-03-14
    C++编写简易服务器 C++编写服务器 C++服务器
  • 如何用一个printf()调用实现一个web服务器
    这篇文章将为大家详细讲解有关如何用一个printf()调用实现一个web服务器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一...
    99+
    2024-04-02
  • 如何使用包含 C 代码的包正确编译 Golang 项目
    问题内容 我开始用 Golang 编写一个项目,但立即遇到了问题。我需要从我的代码连接到硬件,我有一个驱动程序和一个供应商提供的 Golang 包装器。包装器连接的描述说需要将代码放在...
    99+
    2024-02-06
  • 如何用C语言编写一个简单的计算器
    这期内容当中小编将会给大家带来有关如何用C语言编写一个简单的计算器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。描述:简单的实现四则运算1.switch法#include<stdio.h>vo...
    99+
    2023-06-06
  • 基于C++如何编写一个文章生成器
    这篇“基于C++如何编写一个文章生成器”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于C++如何编写一个文章生成器”文章吧...
    99+
    2023-07-05
  • 如何搭建一个 web 服务器
    如何搭建一个 web 服务器?在今天的数字时代,Web服务器是建立和托管自己的网站或应用程序的关键组成部分。虽然有许多方便的解决方案,例如使用云服务提供商提供的托管服务,但是了解如何搭建自己的Web服务器仍然是一个有价值的技能。 一、选择...
    99+
    2024-01-23
    web服务器 如何搭建一个 web 服务器 云服务器知识
  • 利用spring boot如何快速启动一个web项目详解
    前言基于我们创建好的lion项目,使用spring boot,我们就可以通过很少的一些配置,便可以启动这个项目。下面话不多说了,来一起看看详细的介绍吧。方法如下:1 引入Spring boot,我们打开lion父模块的pom文件,继承 sp...
    99+
    2023-05-30
    springboot 快速启动 web项目
  • 阿里云服务器如何运行web项目服务
    简介 阿里云服务器是一种基于云计算技术的虚拟服务器,可以提供强大的计算能力和稳定的网络环境。对于开发人员来说,使用阿里云服务器运行Web项目服务是非常常见的一种选择。本文将介绍如何在阿里云服务器上运行Web项目服务,并提供一些实际案例。步骤...
    99+
    2024-01-20
    阿里 服务器 项目
  • 基于C++怎么编写一个简单的服务器
    这篇文章主要讲解了“基于C++怎么编写一个简单的服务器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于C++怎么编写一个简单的服务器”吧!先写个简易的controller基类继承反射基类,...
    99+
    2023-07-05
  • 关于如何将一个springcloud项目部署至服务器
    目录 1.部署形式 2.Alibaba Cloud Toolkit的使用 3.一个springcloud项目的部署 4.运行jar包 5.后台运行 1.部署形式 一般我们在后端开发中,常常将整个springboot项目打包成war包,或是...
    99+
    2023-09-27
    spring cloud java ide 服务器 经验分享
  • 如何使用xampp将angular项目运行在web服务器
    这篇文章主要介绍如何使用xampp将angular项目运行在web服务器,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!需求在开发angular项目时,因为需要做自适配以适应不同的屏幕...
    99+
    2024-04-02
  • 如何使用C++编写一个简单的电子商务平台?
    如何使用C++编写一个简单的电子商务平台?随着互联网的发展和普及,电子商务已经成为了现代商业运营的重要手段。对于开发者来说,了解如何使用C++编写一个简单的电子商务平台是非常有用的技能。本文将介绍一些基本的概念和技术,以帮助你快速上手。首先...
    99+
    2023-11-02
    C++ (编程语言) 电子商务 (应用领域) 平台 (开发目标)
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作