zoukankan      html  css  js  c++  java
  • cmakelist

    cmake 添加头文件目录,链接动态、静态库

    罗列一下cmake常用的命令。

    CMake支持大写、小写、混合大小写的命令。

    1. 添加头文件目录INCLUDE_DIRECTORIES

    语法:

    include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

    它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用。

    include_directories(../../../thirdparty/comm/include)
    

      

    2. 添加需要链接的库文件目录LINK_DIRECTORIES

    语法:

    link_directories(directory1 directory2 ...)

    它相当于g++命令的-L选项的作用,也相当于环境变量中增加LD_LIBRARY_PATH的路径的作用。

    link_directories("/home/server/third/lib")

    3. 查找库所在目录FIND_LIBRARY

    语法:

    A short-hand signature is:
    
    find_library (<VAR> name1 [path1 path2 ...])
    The general signature is:
    
    find_library (
              <VAR>
              name | NAMES name1 [name2 ...] [NAMES_PER_DIR]
              [HINTS path1 [path2 ... ENV var]]
              [PATHS path1 [path2 ... ENV var]]
              [PATH_SUFFIXES suffix1 [suffix2 ...]]
              [DOC "cache documentation string"]
              [NO_DEFAULT_PATH]
              [NO_CMAKE_ENVIRONMENT_PATH]
              [NO_CMAKE_PATH]
              [NO_SYSTEM_ENVIRONMENT_PATH]
              [NO_CMAKE_SYSTEM_PATH]
              [CMAKE_FIND_ROOT_PATH_BOTH |
               ONLY_CMAKE_FIND_ROOT_PATH |
               NO_CMAKE_FIND_ROOT_PATH]
             )
    

      

    例子如下:

    FIND_LIBRARY(RUNTIME_LIB rt /usr/lib  /usr/local/lib NO_DEFAULT_PATH)

    cmake会在目录中查找,如果所有目录中都没有,值RUNTIME_LIB就会被赋为NO_DEFAULT_PATH

    4. 添加需要链接的库文件路径LINK_LIBRARIES

    语法:

    link_libraries(library1 <debug | optimized> library2 ...)

    # 直接是全路径
    link_libraries(“/home/server/third/lib/libcommon.a”)
    # 下面的例子,只有库名,cmake会自动去所包含的目录搜索
    link_libraries(iconv)
    
    # 传入变量
    link_libraries(${RUNTIME_LIB})
    # 也可以链接多个
    link_libraries("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")
    

      

    可以链接一个,也可以多个,中间使用空格分隔.

    5. 设置要链接的库文件的名称TARGET_LINK_LIBRARIES 

    语法:

    target_link_libraries(<target> [item1 [item2 [...]]]
                          [[debug|optimized|general] <item>] ...)
    # 以下写法都可以: 
    target_link_libraries(myProject comm)       # 连接libhello.so库,默认优先链接动态库
    target_link_libraries(myProject libcomm.a)  # 显示指定链接静态库
    target_link_libraries(myProject libcomm.so) # 显示指定链接动态库
    
    # 再如:
    target_link_libraries(myProject libcomm.so)  #这些库名写法都可以。
    target_link_libraries(myProject comm)
    target_link_libraries(myProject -lcomm)
    

      

    6. 为工程生成目标文件
    语法:
    add_executable(<name> [WIN32] [MACOSX_BUNDLE]
                   [EXCLUDE_FROM_ALL]
                   source1 [source2 ...])

    简单的例子如下:

    add_executable(demo
            main.cpp
    )

    6. 最后贴一个完整的例子


    cmake_minimum_required (VERSION 2.6)
    
    INCLUDE_DIRECTORIES(../../thirdparty/comm)
    
    FIND_LIBRARY(COMM_LIB comm ../../thirdparty/comm/lib NO_DEFAULT_PATH)
    FIND_LIBRARY(RUNTIME_LIB rt /usr/lib  /usr/local/lib NO_DEFAULT_PATH)
    
    link_libraries(${COMM_LIB} ${RUNTIME_LIB})
    
    ADD_DEFINITIONS(
    -O3 -g -W -Wall
     -Wunused-variable -Wunused-parameter -Wunused-function -Wunused
     -Wno-deprecated -Woverloaded-virtual -Wwrite-strings
     -D__WUR= -D_REENTRANT -D_FILE_OFFSET_BITS=64 -DTIXML_USE_STL
    )
    
    
    add_library(lib_demo
            cmd.cpp
            global.cpp
            md5.cpp
    )
    
    link_libraries(lib_demo)
    add_executable(demo
            main.cpp
    )
    
    # link library in static mode
    target_link_libraries(demo libuuid.a)
    

      

    原文链接:http://blog.csdn.net/x_r_su/article/details/52927768


    Cmake知识----编写CMakeLists.txt文件编译C/C++程序

    1.CMake编译原理

    CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))。因此CMake的编译基本就两个步骤:

    cmake
    make
    

      

    make根据生成makefile文件,编译程序。

    2.使用Cmake编译程序

    我们编写一个关于开平方的C/C++程序项目,即b= sqrt(a),以此理解整个CMake编译的过程。

    a.准备程序文件

    文件目录结构如下:

    .
    ├── build
    ├── CMakeLists.txt
    ├── include
    │   └── b.h
    └── src
        ├── b.c
        └── main.c
    

    头文件b.h,如下所示:

    #ifndef B_FILE_HEADER_INC
    #define B_FIEL_HEADER_INC
    
    #include<math.h>
    
    double cal_sqrt(double value);
    
    #endif
    

      

    头文件b.c,如下所示:

    #include "../include/b.h"
    
    double cal_sqrt(double value)
    {
        return sqrt(value);
    }
    

      

    main.c主函数,如下所示:

    #include "../include/b.h"
    #include <stdio.h>
    int main(int argc, char** argv)
    {
        double a = 49.0; 
        double b = 0.0;
    
        printf("input a:%f
    ",a);
        b = cal_sqrt(a);
        printf("sqrt result:%f
    ",b);
        return 0;
    }
    

      

    b.编写CMakeLists.txt

    接下来编写CMakeLists.txt文件,该文件放在和src,include的同级目录,实际方哪里都可以,只要里面编写的路径能够正确指向就好了。CMakeLists.txt文件,如下所示:

    #1.cmake verson,指定cmake版本 
    cmake_minimum_required(VERSION 3.2)
    
    #2.project name,指定项目的名称,一般和项目的文件夹名称对应
    PROJECT(test_sqrt)
    
    #3.head file path,头文件目录
    INCLUDE_DIRECTORIES(
    include
    )
    
    #4.source directory,源文件目录
    AUX_SOURCE_DIRECTORY(src DIR_SRCS)
    
    #5.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
    SET(TEST_MATH
    ${DIR_SRCS}
    )
    
    #6.add executable file,添加要编译的可执行文件
    ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH})
    
    #7.add link library,添加可执行文件所需要的库,比如我们用到了libm.so(命名规则:lib+name+.so),就添加该库的名称
    TARGET_LINK_LIBRARIES(${PROJECT_NAME} m)
    

      

    CMakeLists.txt主要包含以上的7个步骤,具体的意义,请阅读相应的注释。

    c.编译和运行程序

    准备好了以上的所有材料,接下来,就可以编译了,由于编译中出现许多中间的文件,因此最好新建一个独立的目录build,在该目录下进行编译,编译步骤如下所示:

    mkdir build
    cd build
    cmake ..
    make
    

      

    操作后,在build下生成的目录结构如下:

    ├── build
    │   ├── CMakeCache.txt
    │   ├── CMakeFiles
    │   │   ├── 3.2.2
    │   │   │   ├── CMakeCCompiler.cmake
    │   │   │   ├── CMakeCXXCompiler.cmake
    │   │   │   ├── CMakeDetermineCompilerABI_C.bin
    │   │   │   ├── CMakeDetermineCompilerABI_CXX.bin
    │   │   │   ├── CMakeSystem.cmake
    │   │   │   ├── CompilerIdC
    │   │   │   │   ├── a.out
    │   │   │   │   └── CMakeCCompilerId.c
    │   │   │   └── CompilerIdCXX
    │   │   │       ├── a.out
    │   │   │       └── CMakeCXXCompilerId.cpp
    │   │   ├── cmake.check_cache
    │   │   ├── CMakeDirectoryInformation.cmake
    │   │   ├── CMakeOutput.log
    │   │   ├── CMakeTmp
    │   │   ├── feature_tests.bin
    │   │   ├── feature_tests.c
    │   │   ├── feature_tests.cxx
    │   │   ├── Makefile2
    │   │   ├── Makefile.cmake
    │   │   ├── progress.marks
    │   │   ├── TargetDirectories.txt
    │   │   └── test_sqrt.dir
    │   │       ├── build.make
    │   │       ├── C.includecache
    │   │       ├── cmake_clean.cmake
    │   │       ├── DependInfo.cmake
    │   │       ├── depend.internal
    │   │       ├── depend.make
    │   │       ├── flags.make
    │   │       ├── link.txt
    │   │       ├── progress.make
    │   │       └── src
    │   │           ├── b.c.o
    │   │           └── main.c.o
    │   ├── cmake_install.cmake
    │   ├── Makefile
    │   └── test_sqrt
    ├── CMakeLists.txt
    ├── include
    │   └── b.h
    └── src
        ├── b.c
        └── main.c
    

      

    注意在build的目录下生成了一个可执行的文件test_sqrt,运行获取结果如下:

    命令:
    ./test_sqrt 
    结果:
    input a:49.000000
    sqrt result:7.000000
    

      

    d.源码

    地址test_sqrt.tar.gz

    3.参考资料

    [1]. CMake 使用方法 & CMakeList.txt

    https://www.cnblogs.com/cv-pr/p/6206921.html


    aux_source_directory 查找在某个路径下的所有源文件。

    aux_source_directory(< dir > < variable >)

      搜集所有在指定路径下的源文件的文件名,将输出结果列表储存在指定的变量中。该命令主要用在那些使用显式模板实例化的工程上。模板实例化文件可以存储在Templates子目录下,然后可以使用这条命令自动收集起来;这样可以避免手工罗列所有的实例。

      使用该命令来避免为一个库或可执行目标写源文件的清单,是非常具有吸引力的。但是如果该命令貌似可以发挥作用,那么CMake就不需要生成一个感知新的源文件何时被加进来的构建系统了(也就是说,新文件的加入,并不会导致CMakeLists.txt过时,从而不能引起CMake重新运行。——译注)。正常情况下,生成的构建系统能够感知它何时需要重新运行CMake,因为需要修改CMakeLists.txt来引入一个新的源文件。当源文件仅仅是加到了该路径下,但是没有修改这个CMakeLists.txt文件,使用者只能手动重新运行CMake来产生一个包含这个新文件的构建系统。

  • 相关阅读:
    Mybatis 原始dao CRUD方法
    JQuery的焦点事件focus() 与按键事件keydown() 及js判断当前页面是否为顶级页面 子页面刷新将顶级页面刷新 window.top.location
    使用actionerror做失败登录验证
    Java项目中的下载 与 上传
    shiro框架 4种授权方式 说明
    javascript 中数组的创建 添加 与将数组转换成字符串 页面三种提交请求的方式
    序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询 多表关联查询
    Spring data JPA 理解(默认查询 自定义查询 分页查询)及no session 三种处理方法
    orcal 数据库 maven架构 ssh框架 的全注解环境模版 maven中央仓库批量删除lastupdated文件后依然是lastupdated解决方法 mirror aliyun中央仓库
    EasyUI加zTree使用解析 easyui修改操作的表单回显方法 验证框提交表单前验证 datagrid的load方法
  • 原文地址:https://www.cnblogs.com/ranson7zop/p/8204188.html
Copyright © 2011-2022 走看看