• cmake在实际复杂项目中的使用


    在实际复杂的项目之中,会有很多的源文件,以及对于库的依赖,如果直接使用makefile会比较的繁琐,而且makefile的推导规则也非常多,对多目录的支持也比较复杂。

    最近看了一下cmake,发现配置起来比直接使用makefile要方便很多,学习成本也比较低。

    现在假设我们有一个server目录,内部有一个redis目录,就用两个目录来说明问题。

    在server目录下,我们创建一个CMakeLists.txt,在redis下也创建一个同样名字的文件,但是内容不同。

    由于只昨天晚上学习了一下cmake的使用,粗浅的将实际项目中的makefile替换了,有些不对的地方如果后续发现了,将进行改正

    1、首先看下server目录下的CMakeLists.txt

    PROJECT(server)
    CMAKE_MINIMUM_REQUIRED(VERSION 2.6)

    INCLUDE_DIRECTORIES("/usr/local/include")
    INCLUDE_DIRECTORIES("/usr/include/mysql")
    INCLUDE_DIRECTORIES("/usr/include/boost")
    INCLUDE_DIRECTORIES("/usr/include/")

    ADD_SUBDIRECTORY(redis)
    AUX_SOURCE_DIRECTORY(. DIR_SRCS)
    MESSAGE(STATUS "dir src:" +${DIR_SRCS})
    #ADD_EXECUTABLE(server${DIR_SRCS})

    LINK_DIRECTORIES("/usr/local/lib")
    LINK_DIRECTORIES("/usr/local/mysql/lib")
    LINK_DIRECTORIES("/usr/local/protobuf/lib")
    #LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu/")

    ADD_EXECUTABLE(server ${DIR_SRCS})

    TARGET_LINK_LIBRARIES(server redis)
    TARGET_LINK_LIBRARIES(server net)
    TARGET_LINK_LIBRARIES(server log4cplus)
    TARGET_LINK_LIBRARIES(server mysqlclient)
    TARGET_LINK_LIBRARIES(server boost_system)
    TARGET_LINK_LIBRARIES(server boost_thread)
    TARGET_LINK_LIBRARIES(server protobuf)
    #TARGET_LINK_LIBRARIES(server net)
    TARGET_LINK_LIBRARIES(server TinyXml)

    需要对使用到的关键字逐一进行一下说明:

    (1) PROJECT 指定我们项目的名字,跟最后生成的可执行文件名是可以不一样的,两者没有什么关系

    (2) CMAKE_MINIMUM_REQUIRED 指定cmake的版本,我用的环境是Ubuntu14 和 cmake2.8,如果不指定的话,在2.8下会直接提示错误的

    (3) INCLUDE_DIRECTORIES 指定项目使用到的头文件目录,可以一次包含多个头文件目录,我为了清晰,每次只包含一个。

    (4) ADD_SUBDIRECTORY 这个就是指定我们用到的子目录,在这里就是redis

    (5) AUX_SOURCE_DIRECTORY 这个是指定我们server目录下需要用到的所有问题,这里使用一个"."当前目录符号替代就可以了,但是在子目录下如果这么这么使用就会报错,目前还不太清楚为什么。

    (6) MESSAGE 属于提示信息,方便查看的,可有可无

    (7) LINK_DIRECTORIES 指定程序需要链接的库目录

    (8) ADD_EXECUTABLE 指定我们程序最后可执行文件的名字

    (9) TARGET_LINK_LIBRARIES 最后是链接时候用到的库文件名字,跟INCLUDE_DIRECTORIES,也可以一次写多个,这里需要特别注意的是,其中net库是自己编写的,其中用到了boost_thread库,如果将net库写在boost_thread库后面的话,在链接的时候,会提示找不到boost_thread库,一定要写在net库依赖库的前面

    具体的每个关键字的用法,可以网上找下cmake的手册看下

    2、我们看下redis子目录下的CMakeLists.txt写法

    #AUX_SOURCE_DIRECTORY(. DIR_REDIS_SRCS)
    SET(DIR_REDIS_SRCS
    anet.cpp
    )
    MESSAGE(STATUS ${DIR_REDIS_SRCS})
    ADD_LIBRARY (redis ${DIR_REDIS_SRCS})

    注意将redis子目录编译成了一个lib库,然后跟server目录下进行连接了

    3、然后就是开始使用cmake进行编译了,在server目录下使用“cmake .” 命令进行预生成,cmake会检查语法以及编译环境,如果没问题,就可以使用make指令进行实际的编译操作了

  • 相关阅读:
    Java Arrays.asList注意事项
    从给定的N个正数中选取若干个数之和最接近M
    java 8 foreach获取索引
    更优雅地关闭资源
    idea 下获取路径下文件的方法
    IDEA类和方法注释模板设置(非常详细)
    503 Error: need EHLO and AUTH first
    fatal error C1083: Cannot open include file: 'openssl/opensslv.h'
    'pip' 不是内部或外部命令
    JS中every()和some()的用法
  • 原文地址:https://www.cnblogs.com/chobits/p/3769700.html
Copyright © 2020-2023  润新知