cmake使用例程如下
(1)cmake工具需要内核支持sctp模块,需要安装sctp开发包:lksctp - tools 以及lksctp - tools - devel
(2)在Linux系统内安装cmake
(3)如何建立一个包含多个源文件夹的工程
本文这里以socket 通信为例:
(1)新建以下文件夹
build、server、client、includes、pubs五个文件夹
build:是构建工程时需要的文件夹,里面包含client工程和server工程两个文件夹
server:是存放server.c(服务器端源代码) 和server.h(服务器端源代码头文件)文件的源文件夹
client:是存放client.c(客户端源代码)和client.h(客户端源代码头文件)文件的源文件夹
includes:是存放公共使用的头文件,里面包含include.h(可以将常使用的库文件包含在这里)
pubs:是存放公用函数的文件,此处里面包含出错记录文件error_log.c(出错记录函数)和error_log.h(出错记录函数头文件)
(2)新建好以上文件夹和相应的代码之后,在文件夹中编写CMakeLists.txt文件
build目录是工程构建的目录,这里不需要编写CMakeLists.txt
include目录是只包含的头文件目录,也不需要编写CMakeLists.txt文件
因此只 需要在一下三个文件中中编写CMakeLists.txt文件
1:pubs:中的CMakeLists.txt文件内容如下,由于是公用文件包含公用的代码,因此只编译生成相应的库文件就好。
# 这个文件是公用的文件,里面的函数别的代码也需要调用,因此把他编译成库文件,
# 这里设置库文件的路径就是当前路径,注意(. DIR_PUBS_SRCS)中的PUBS就是这个文件夹的名称
AUX_SOURCE_DIRECTORY(. DIR_PUBS_SRCS)
# 设置编译后生成的库文件名称,别的程序再编译的时候,如果调用了这里面的函数就会链接这个库文件
ADD_LIBRARY ( pubs ${DIR_PUBS_SRCS})
2:client:中的CMakeLists.txt文件内容如下
# cmake版本的最低要求
cmake_minimum_required ( VERSION 2.8 )
# 工程名字
project (client)
# 设置cmake编译之后保留源代码
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
# 设置cmake编译之后生成的可执行文件是debug版本
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
# 设置cmake编译之后生成的可执行文件是relese版本
#set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
# 设置编译查找库名称
find_package(Threads REQUIRED)
# 设置包含的文件路径,这里我们需要包含includes 和公用的pubs两个文件
include_directories(../includes ../pubs)
# 设置子文件名称(就这这个源文件包含的文件夹,这里就是软连接的文件名)
ADD_SUBDIRECTORY(pubs)
# 设置源文件的位置就是当前文件夹
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
# 设置生成可执行文件的名称
add_executable(client ${DIR_SRCS})
# 设置生成可执行文件时需要链接的库文件,这里也就是我们公用的pubs编译后生成的.o文件
target_link_libraries(client pubs ${CMAKE_THREAD_LIBS_INIT})
3:server:中的CMakeLists.txt文件内容如下和上面类似
# cmake版本的最低要求
cmake_minimum_required ( VERSION 2.8 )
# 工程名字
project (server)
# 设置cmake编译之后保留源代码
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
# 设置cmake编译之后生成的可执行文件是debug版本
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
# 设置cmake编译之后生成的可执行文件是relese版本
#set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
# 设置编译查找库名称
find_package(Threads REQUIRED)
# 设置包含的文件路径,这里我们需要包含includes 和公用的pubs两个文件
include_directories(../includes ../pubs)
# 设置子文件名称(就这这个源文件包含的文件夹,这里就是软连接的文件名)
ADD_SUBDIRECTORY(pubs)
# 设置源文件的位置就是当前文件夹
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
# 设置生成可执行文件的名称
add_executable(server ${DIR_SRCS})
# 设置生成可执行文件时需要链接的库文件,这里也就是我们公用的pubs编译后生成的.o文件
target_link_libraries(server pubs ${CMAKE_THREAD_LIBS_INIT})
(3)进入client文件夹和server文件夹执行
ln -s ../pubs pubs
(将上一层目录中的pubs目录软连接到这里,为什么药进行软连接呢?就是因为这里使用了pubs中的文件的代码)
(4)进入build目录,新建两个工程文件server和client,如果只有一个工程就建一个工程名就好
执行
cmake ../../server (生成对应Makefile文件) 再执行make
cmake ../../client (生成对应的Makefile文件)再执行make
(5)执行上述操作之后,如果没有错误就会出现相对应的可执行文件名,这里是server和client