cmake项目工程中的头文件与库连接

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一些常用的函数,如下:

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]

Leave a Reply

Your email address will not be published. Required fields are marked *