一次偶然的机会需要在服务器上部署一个自己的框架,完全自己是二把手,之前没有做过游戏服务器底层的东西,只是看多别人的代码和框架东西,也参与过一段时间的服务器开发工作,当然,工作中做的最多的还是服务器的业务逻辑的东西。自己的好奇和兴趣促使我去了解服务器底层的一些东西,目前一个很重要的点马上抛出了我的脑海,那就是“epoll”,linux下的一个技术,好像是I/o复用,就是用一个句柄来控制很多其他的句柄,现在很多流行的服务器上多事这种配置的框架。目前一直在学习和了解,并且在实践的就是hiredis的使用,这个是c++对redis的再次包装。自己在实过程中,希望能够编译代码,可以完成代码的运行。此刻,有一个技术的东西,配置表CMakeLists出现在我的眼前,之前最先出现在我眼前的是makefile文件,通过执行make的方式直接编译代码,这个在linux下非常的使用,但对我第一次接触配置的人来说,其中的规则,着实让我看的头晕了很多,还好,我发现了CMakeLists,即用cmake来编译的方式来编译代码,这个的语法简单,基本上能够满足平时的需要,特别是,让我想到了vs下的配置表样式,之前在vs下是直接在属性上配置,选择目录,现在用了cmake,其实原理和这个也很像,基本上区别不大,只是不能选择文件夹了,只能自己确定的指定文件夹。这种方式在外行看来,固然是很麻烦的,但是在程序员的世界里,敲命令比按鼠标更加的具有吸引力,这也是我最喜欢的,也最想达到的阶段,目前来看,自己的水平还只是刚刚会用,基本上都不能说是入门,只要平时多用用,这种情况就会大大的改善的。
好了,接下来可以说说cmake的事情了,当然,cmake不是所有的包装板的linux发行版都会有的,需要下载,ubuntu通过apt-get install cmake下载即可,当然也可以通过压缩包下载,现在基本上下载的压缩包都已经支持直接编译,即make即可,然后再make install,这里不太明白,为什么很少使用cmake的,看来make还是很有优势的,以后能学学,搞搞清楚装装比格,哈哈,这次还是重点讲cmakelist吧。cmke有一些特殊的定义,比如我列几个常用的:
project 命令
语句 : project(
作用 : 指定项目名 例子:project(hello) --目前似乎不用也可以的(反正我没有用到过)
cmake_minimum_required 命令
语句 : cmake_minimum_required(VERSION major[.minor[.patch[.tweak]]] [FATAL_ERROR])
作用 : 指定cmake需要的最小版本 例子:cmake_minimum_required(VERSION 3.2)
aux_source_directory 命令
语句 : aux_source_directory(
作用 : 获取指定目录下的所有文件,保存到variable中,包括 .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp .hxx .in .txx文件
示例 : aux_source_directory(. var)#获取当前目录中源文件 获取当前目录下var目录的所有文件
add_executable 命令
语句 : add_executable(
作用 : 将指定文件source编译成可执行文件,命名位name
示例 : add_executable(hello hello.cpp)
add_library 命令
语句 : add_library([STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)
作用 : 添加一个名为
示例 : add_library(Lib ${DIR_SRCS}) 这个就是一添加一个库,并制定所使用库的模式
解释:就是将${DIR_SRCS}中的库添加到Lib中
target_link_libraries 命令
语句 : target_link_libraries(
作用 : 用于指定 target 需要链接 item1 item2 …。这里 target 必须已经被创建,链接的 item 可以是已经存在的 target(依赖关系会自动添加)
示例 : target_link_libraries(Main Lib) 解释:就是将Main程序需要Lib库的支持 此处需要注意,基本上linux下二定制的文件都是.a后缀的,即静态库吗,也可以是动态库,后缀是.so。
set 命令
语句 : set(
作用 : 用于设定变量 variable 的值为 value。variable可以自己定义
示例 : set(var "${list}_exe")
unset 命令
语句 : unset(
作用 : 用于移除变量 variable。如果指定了 CACHE 变量将被从 Cache 中移除。
示例 : unset(VAR CACHE)
message 命令
语句 : message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] “message to display” …)
作用 : 输出信息
示例 : message("hello world")
include_directories 命令
语句 : include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)
作用 : 用于设定目录,这些设定的目录将被编译器用来查找 include 文件
示例 : include_directories(${PROJECT_SOURCE_DIR}/lib)
解释:这个就像是vs中的添加引用文件ADD_CUSTOM_COMMAND(TARGET ${THREDIS}
PRE_BUILD
COMMAND cd hiredis && make
# COMMAND cp hiredis/libhiredis.a .
)这就是说需要进行一个命令的执行,PRE_BUILD表示是在链接之前执行
ADD_SUBDIRECTORY(tHiredis) --直接编译该目录下的CMakeLists.txt文件,tHiredis 是一个目录名
好了基本上就是这些内容了,当然了CMake的功能可不止这些,还有一些可以设计的逻辑关系,和文件处理,此处很少用到(我很少用到),有兴趣的可以去好好看一下,我提供的后面这个链接,虽然不是很全,也可以结合其他的部分再继续学习,不过我的问题,这些只是就足够了!
今天写了一个小小的cmkaelists.txt文件,但是爆出了一个cmake_cxx_compiler 没有定义,完了,不是有gcc吗,好吧,那我就自己定义一个吧,
cmake -D CMAKE_CXX_COMPILE 但是,又是一大堆的错误,怎么办,不知道,只能下载g++看看吧。
参考网址:https://my.oschina.net/u/1046919/blog/477645
结果是好了,还真好了,还有一定要在cmakelists.txt中使用{},不能使用(),一定要注意了!
3.今天又爆出了一个问题:
/usr/bin/ld: cannot find -lhiredis
collect2: error: ld returned 1 exit status
初步分析:是因为没有安装hiredis造成的,需要安装才行