作者:手机用户2602931923_450 | 来源:互联网 | 2023-08-29 13:55
在做这个服务器的时候,遇到很多奇葩的问题。
以前做项目都是使用强大的VS,这次使用 G++编译器,配合 makefile 命令使用,算是了解了控制台下的项目是怎么做的了。
若干话题
多平台
要解决多平台的问题,那么应该要有一个统一的接口,然后再分别实现。
在一个配置文件中,定义宏如下:
#ifndef CPPSERVER
#define CPPSERVER
#define WINDOWS10
#ifdef WINDOWS10
#include"windows/Windows.h"
#endif
#ifdef LINUX
#include"linux/Linux.h"
#endif
#endif
然后就可以在不同的目录下完成不同平台的编写。当然,在统一接口名的时候,要小心一点,保证两者的一致性。
socket
对于socket 的编程而言,在Windows 和Linux 下是不一样的,所以这里分开实现了。
对于socket 的声明如下:
class Socket
{
public:
Socket() {}
virtual ~Socket() {}
virtual void close() = 0;
virtual void accept(Socket*)=0;
virtual bool connect() = 0;
virtual int send(const char*, unsigned int , int = 0) = 0;
virtual int recv(char*, unsigned int , int = 0) = 0;
};
当然,这只是一个很初级的版本。不过代码放在github上,可以在那里获得最新版。
各种小问题
makefile
makefile 命令的编写真是折腾了快一个小时。
先放一下现在的命令,以便以后查看。
objects = base.o Windows.o WindowsSocket.o cppserver.o
cppserver: $(objects)
g++ $(objects) -lWS2_32 -o cppserver
base.o: base.h base.cpp
g++ -c base.cpp -std=c++11
Windows.o: windows/Windows.h windows/Windows.cpp
g++ -c windows/Windows.cpp -std=c++11
WindowsSocket.o:socket/socket.h windows/WindowsSocket.h windows/WindowsSocket.cpp
g++ -c windows/WindowsSocket.cpp -std=c++11 -lWS2_32
cppserver.o: cppserver.cpp cppserver.h base.h
g++ -c cppserver.cpp -std=c++11 -lWS2_32
ttest: test.cpp
g++ test.cpp base.cpp windows/WindowsSocket.cpp -std=c++11 -lWS2_32 -o ttest
clean:
erase *.o
*vs code 不能用来编写makefile ,因为它用四个空格替换了 tab。然而makefile 以tab 作为分类器的标准。
全局变量:全局变量的声明应该尽量添加 extern
关键字。因为当使用make 命令后,最后是多个目标文件合成一个可执行文件,那么,可能会出现全局变量重复定义的问题。
声明写在.h 文件中,定义写在 .cpp 中:前辈们的话是有道理的。当定义也写在头文件中时,一个很头疼的问题就是头文件的重复包含,你必须小心地使用前向声明或者增加多个头文件来解除依赖。
然而,如果分开声明和定义的话,就可以很好地避免这个问题。另外一个值得这么做的原因是,避免函数的重复定义,理由见上。
我的github
xiaosa233