关于CMakeLists的一个小小的学习,以hiredis的动作持续跟进

来源:互联网 发布:淘宝客服的工作好做吗 编辑:程序博客网 时间:2024/06/05 16:38

一次偶然的机会需要在服务器上部署一个自己的框架,完全自己是二把手,之前没有做过游戏服务器底层的东西,只是看多别人的代码和框架东西,也参与过一段时间的服务器开发工作,当然,工作中做的最多的还是服务器的业务逻辑的东西。自己的好奇和兴趣促使我去了解服务器底层的一些东西,目前一个很重要的点马上抛出了我的脑海,那就是“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(<projectname> [languageName1 languageName2 … ] )

    作用 : 指定项目名  例子: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(<dir> <variable>)

    作用 : 获取指定目录下的所有文件,保存到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(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)

    作用 : 将指定文件source编译成可执行文件,命名位name

    示例 : add_executable(hello hello.cpp)  

add_library 命令

    语句 : add_library([STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)

    作用 : 添加一个名为<name>的库文件,指定STATIC,SHARED,或者MODULE参数用来指定要创建的库的类型。STATIC库是目标文件的归档文件,在链接其它目标的时候使用。SHARED库会被动态链接,在运行时被加载。MODULE库是不会被链接到其它目标中的插件,但是可能会在运行时使用dlopen-系列的函数动态链接。如果没有类型被显式指定,这个选项将会根据变量BUILD_SHARED_LIBS的当前值是否为真决定是STATIC还是SHARED

    示例 : add_library(Lib ${DIR_SRCS})  这个就是一添加一个库,并制定所使用库的模式

解释:就是将${DIR_SRCS}中的库添加到Lib中

target_link_libraries 命令

    语句 : target_link_libraries(<target> [item1 [item2 […]]] [[debug|optimized|general] ] …)

    作用 : 用于指定 target 需要链接 item1 item2 …。这里 target 必须已经被创建,链接的 item 可以是已经存在的 target(依赖关系会自动添加)

    示例 : target_link_libraries(Main Lib)     解释:就是将Main程序需要Lib库的支持    此处需要注意,基本上linux下二定制的文件都是.a后缀的,即静态库吗,也可以是动态库,后缀是.so。


set 命令

    语句 : set(<variable> <value> [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])

    作用 : 用于设定变量 variable 的值为 value。variable可以自己定义

    示例 : set(var "${list}_exe")   

unset 命令

    语句 : unset(<variable> [CACHE])

    作用 : 用于移除变量 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造成的,需要安装才行


0 0
原创粉丝点击