common.h——自己常用的头文件

本文汇总了C/C++进行系统级编程时常用的头文件,包括文件操作、进程控制、网络通信等功能,为读者提供了全面的系统编程基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#ifndef _COMMON_H_
#define _COMMON_H_
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <wait.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>
#include <pthread.h>
#include <time.h>
#include <stdarg.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/select.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/time.h>
#include <iostream>
#include<thread>
#include<vector>
using namespace std;

#pragma pack(1)

#pragma pack()
#endif

 

<think>我们有一个CMakeLists.txt文件,用于构建一个名为dhcpServer的静态库。下面我将逐部分解释这个CMake脚本。 1. **指定CMake最低版本和项目名称**: ```cmake CMAKE_MINIMUM_REQUIRED(VERSION 2.6) PROJECT(dhcpServer) ``` - `CMAKE_MINIMUM_REQUIRED`:指定构建该项目所需的最低CMake版本为2.6。 - `PROJECT`:设置项目名称为`dhcpServer`。 2. **收集源文件**: ```cmake AUX_SOURCE_DIRECTORY(./ SRC_FILES) AUX_SOURCE_DIRECTORY(./data DATA_SRC) ``` - `AUX_SOURCE_DIRECTORY`:将当前目录(`./`)下的所有源文件添加到变量`SRC_FILES`中。 - 同样,将`./data`目录下的所有源文件添加到变量`DATA_SRC`中。 - 注意:`AUX_SOURCE_DIRECTORY`不会递归子目录,且可能不会包含所有类型的源文件(如头文件),通常更推荐使用`file(GLOB ...)`命令。 3. **设置包含目录**: ```cmake SET(INCLUDE_DIR_COMMON ../../common) SET(INCLUDE_DIR_APP ../../application) ... # 多个SET命令设置包含路径变量 INCLUDE_DIRECTORIES(${INCLUDE_DIR_COMMON} ...) ``` - 使用`SET`命令定义多个包含目录的路径,然后通过`INCLUDE_DIRECTORIES`将这些路径添加到编译器的头文件搜索路径中。 4. **添加预处理器定义**(注释状态): ```cmake #ADD_DEFINITIONS(-DDEBUG) ``` - 如果需要启用调试,可以取消注释,这样会在编译时定义`DEBUG`宏。 5. **设置库路径**: ```cmake SET(STATIC_LIB_PATH "../../archive/") SET(DYNAMIC_LIB_PATH "../../archive/usr/lib") LINK_DIRECTORIES(${DYNAMIC_LIB_PATH} ${STATIC_LIB_PATH}) ``` - 设置静态库和动态库的搜索路径,然后通过`LINK_DIRECTORIES`将这些路径添加到链接器的库搜索路径中。 - 注意:在现代CMake中,更推荐使用`target_link_directories`命令,而不是全局设置`LINK_DIRECTORIES`。 6. **设置库输出路径**: ```cmake SET(LIBRARY_OUTPUT_PATH ../archive/) ``` - 设置生成的库文件(静态库或动态库)的输出目录为`../archive/`。 7. **添加库目标**: ```cmake ADD_LIBRARY(dhcpServer STATIC ${SRC_FILES} ${DATA_SRC}) ``` - 使用`ADD_LIBRARY`命令创建一个名为`dhcpServer`的静态库,源文件来自`SRC_FILES`和`DATA_SRC`变量。 8. **设置目标属性**(注释状态): ```cmake #SET_TARGET_PROPERTIES(dhcpServer PROPERTIES VERSION 1.0 SOVERSION 0) ``` - 这里被注释了,如果取消注释,将为库设置版本号。`VERSION`是库的版本,`SOVERSION`是API版本。 9. **安装目标**(注释状态): ```cmake #INSTALL(TARGETS dhcpServer ARCHIVE DESTINATION lib) ``` - 如果取消注释,该命令会在执行安装时(`make install`)将静态库安装到`lib`目录下。 **注意**:这个CMake脚本使用了一些较老的方法(如`AUX_SOURCE_DIRECTORY`和`LINK_DIRECTORIES`),在现代CMake实践中,更推荐使用`target_include_directories`和`target_link_libraries`等命令,以更精确地控制每个目标的属性。 **改进建议**: 1. 使用`file(GLOB ...)`代替`AUX_SOURCE_DIRECTORY`,并明确指定文件扩展名,以避免包含不必要的文件。 2. 使用`target_include_directories`为特定目标设置包含目录,而不是全局设置。 3. 使用`target_link_directories`和`target_link_libraries`为特定目标设置链接路径和链接库,而不是全局设置。 下面是一个改进版本的示例(部分): ```cmake cmake_minimum_required(VERSION 3.10) project(dhcpServer) # 使用GLOB收集源文件 file(GLOB SRC_FILES "./*.c") file(GLOB DATA_SRC "./data/*.c") # 创建静态库 add_library(dhcpServer STATIC ${SRC_FILES} ${DATA_SRC}) # 设置包含目录(针对目标) target_include_directories(dhcpServer PRIVATE ../../common ../../application ../../platform ../../application/dhcp ../ # INCLUDE_DIR_APP_DHCP_PRVT ./ # INCLUDE_DIR_APP_DHCP_SERVER_PRVT ../../application/h ) # 设置库输出目录 set_target_properties(dhcpServer PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "../archive" ) # 如果需要,可以设置版本 # set_target_properties(dhcpServer PROPERTIES VERSION 1.0 SOVERSION 0) # 安装(可选) # install(TARGETS dhcpServer ARCHIVE DESTINATION lib) ``` 这个改进版本使用了更现代的方法,并且将包含目录的作用域限制在`dhcpServer`目标上,避免了全局设置可能带来的副作用。 §§相关问题§§: 1. 在CMake中,`AUX_SOURCE_DIRECTORY`和`file(GLOB)`有什么区别,各自有什么优缺点? 2. 在CMake中,如何设置一个目标同时生成静态库和动态库? 3. 如何在CMake中为不同的构建类型(如Debug和Release)设置不同的编译选项? 4. 在CMake中,`PRIVATE`、`PUBLIC`和`INTERFACE`在`target_include_directories`中有什么区别?</think>### CMakeLists.txt 分析 #### 1. 基础配置 ```cmake CMAKE_MINIMUM_REQUIRED(VERSION 2.6) # 要求CMake最低版本2.6 PROJECT(dhcpServer) # 定义项目名称为dhcpServer ``` #### 2. 源文件收集 ```cmake # 收集当前目录所有源文件 AUX_SOURCE_DIRECTORY(./ SRC_FILES) # 收集data目录所有源文件 AUX_SOURCE_DIRECTORY(./data DATA_SRC) # 替代方案:手动指定单个文件 # SET(SRC_FILES ./dhcpServer.c) ``` #### 3. 包含目录设置 ```cmake # 设置多个头文件搜索路径 SET(INCLUDE_DIR_COMMON ../../common) SET(INCLUDE_DIR_APP ../../application) ... # 其他路径设置 # 将所有路径添加到编译器的头文件搜索路径 INCLUDE_DIRECTORIES(${INCLUDE_DIR_COMMON} ...) ``` #### 4. 预处理器定义 ```cmake # 可选的调试宏定义(当前被注释) # ADD_DEFINITIONS(-DDEBUG) ``` #### 5. 库路径配置 ```cmake # 设置静态库和动态库的搜索路径 SET(STATIC_LIB_PATH "../../archive/") SET(DYNAMIC_LIB_PATH "../../archive/usr/lib") # 将库路径添加到链接器搜索路径 LINK_DIRECTORIES(${DYNAMIC_LIB_PATH} ${STATIC_LIB_PATH}) ``` #### 6. 输出目录配置 ```cmake # 设置库文件的输出目录 SET(LIBRARY_OUTPUT_PATH ../archive/) ``` #### 7. 构建目标 ```cmake # 创建名为dhcpServer的静态库 ADD_LIBRARY(dhcpServer STATIC ${SRC_FILES} ${DATA_SRC}) ``` #### 8. 目标属性设置 ```cmake # 设置库版本信息(当前被注释) # SET_TARGET_PROPERTIES(dhcpServer PROPERTIES VERSION 1.0 SOVERSION 0) ``` #### 9. 安装规则 ```cmake # 安装库文件到指定目录(当前被注释) # INSTALL(TARGETS dhcpServer ARCHIVE DESTINATION lib) ``` --- ### 关键点解释 1. **源文件收集**: - `AUX_SOURCE_DIRECTORY` 自动收集目录下所有源文件(*.c, *.cpp等) - 替代方案是手动 `SET` 文件列表 2. **目录结构**: ```bash ../../common # 公共代码 ../../platform # 平台相关代码 ../../application # 应用层代码 ./data # 数据文件 ../archive # 输出目录 ``` 3. **构建流程**: - 收集源文件 → 设置包含路径 → 配置库路径 → 构建静态库 → 输出到archive目录 4. **扩展性设计**: - 通过 `ADD_DEFINITIONS` 支持条件编译 - 通过 `SET_TARGET_PROPERTIES` 管理库版本 - 通过 `INSTALL` 支持部署 --- ### 改进建议 ```cmake # 建议1:使用现代CMake目标管理 target_include_directories(dhcpServer PRIVATE ${INCLUDE_DIR_COMMON} ${INCLUDE_DIR_APP} ... ) # 建议2:精确控制源文件(避免意外包含) file(GLOB_RECURSE SRC_FILES CONFIGURE_DEPENDS "*.c" "*.cpp") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值