1.当项目变得庞大时,我们需要划分头文件和功能模块的cpp文件。
2.例如在unp编程中,我把第六章的模块划分为如下:(项目源码网址为:https://github.com/siukwan/unix)
其中func_err.cpp和func_wrap.cpp包含了常用的函数,这些函数在下面的tcpcli.cpp和tcpserv.cpp等文件中需要使用,这两个文件均#include”func.h”。
而tcpcli.cpp和tcpserv.cpp也包含了#include”func.h”。那么tcpcli.cpp和tcpserv.cpp如何能够调用func_err.cpp和func_wrap.cpp里面的函数呢?
首先,因为均包含了公共头文件func.h,所以我们需要在func.h中extern一些常用的函数,如下:
这些函数的定义在func_err.cpp和func_wrap.cpp里面,extern只是告诉编译器,编译的时候需要从其他文件中搜索这些函数的定义。
但是tcpcli.cpp和tcpserv.cpp没有直接包含func_err.cpp和func_wrap.cpp,编译的时候找不到这些函数怎么办?
接下来就是需要使用到库和连接了,以下以tcpcli.cpp和func_err.cpp举例。tcpcli.cpp虽然没有定义func_err中的函数,但是因为包含了func.h头文件,这些函数被声明了,这是,我们不能把tcpcli.cpp编译成执行文件,但是可以先把tcpcli.cpp和func_err.cpp编程成.o文件,然后把这两个.o文件连接起来生成执行文件。
CMakeList中的写法如下:
[shell]
#设置错误函数和包裹函数
SET(LIB_FUNC_ERR_SRC func_err.cpp)
SET(LIB_FUNC_WRAP_SRC func_wrap.cpp)
#设置服务器编译文件
SET(SERVER_SRC_LIST tcpserv.cpp)
#连接库
ADD_LIBRARY(FuncErr STATIC ${LIB_FUNC_ERR_SRC} )
ADD_LIBRARY(FuncWrap STATIC ${LIB_FUNC_WRAP_SRC} )
#输出可执行文件
ADD_EXECUTABLE(server ${SERVER_SRC_LIST})
TARGET_LINK_LIBRARIES(server FuncErr FuncWrap)
[/shell]