zoukankan      html  css  js  c++  java
  • CMakeLists.txt

    CMakeLists 例子1:

    文件目录

    ├── CMakeLists.txt
    ├── include
    │   └── StaticBubble.h
    └── src
        ├── StaticBubble.cpp
        └── testBubble.cpp
    

    StaticBubble.h

    #include <iostream>
    using namespace std;
    void bubbleSort(int array[], int num);
    

    StaticBubble.cpp

    #include <iostream>
    using namespace std;
    void bubbleSort(int array[], int num){
        for(int i = 0; i < num; i++){
            for(int j = 0; j < num - i - 1; j++){
                if(array[j] > array[j + 1]){
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
        }
    }
    

    testBubble.cpp

    #include <iostream>
    #include <StaticBubble.h>
     
    using namespace std;
     
    int main(int argc, char **argv){
        int array[5] = {32,54,38,65,98};
        bubbleSort(array, 5);
        for(int i = 0; i < 5; i++){
            cout << array[i] << '	';
        }
        cout << endl;
     
    }
    

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.5)
    project(Static_Lib)
     
    set(CMAKE_CXX_STANDARD 11)
     
    include_directories(include)
    add_library(StaticBubble SHARED src/StaticBubble.cpp)   #STATIC  or SHARED
    
    add_executable(Static_Lib src/testBubble.cpp)
    target_link_libraries(Static_Lib StaticBubble)
    

    在目录下新建文件夹build,并编译

    mkdir build
    cd build
    cmake ..
    make
    

    在build文件夹下生成如下:

    .
    ├── CMakeCache.txt
    ├── CMakeFiles
    ├── cmake_install.cmake
    ├── libStaticBubble.so
    ├── Makefile
    └── Static_Lib
    
    

    运行:

    ./Static_Lib
    

    显示如下:

    /tmp/test/build$ ./Static_Lib
    32	38	54	65	98
    

    CMakeLists语法1:include_directories

    include_directories(include)

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

    添加编译器用于查找头文件的文件夹,如果文件夹路径是相对路径,则认为该路径是基于当前源文件的路径。
    将给定目录加给编译器搜索到的包含文件 .默认情况下,加到目录列表的最后. 通过设定 CMAKE_include_directories_BEFORE 为 ON 来改变. 通过使用 BEFORE or AFTER 可以加在前面或者后面. 如果设定 SYSTEM 选项 编译器认定为系统包含目录.

    CMakeLists语法2:add_library 将指定的源文件生成链接文件, 即是如何构建一个库供他人使用。完成这个任务需要用到ADD_LIBRARY()

    add_library(StaticBubble SHARED src/StaticBubble.cpp) #STATIC or SHARED

    add_library(<name> [STATIC | SHARED | MODULE]
                [EXCLUDE_FROM_ALL]
                source1 [source2 ...])
    

    :库的名字,直接写名字即可,不要写lib,会自动加上前缀的哈。
    [STATIC | SHARED | MODULE] :类型有三种。
    SHARED,动态库
    STATIC,静态库
    MODULE,在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待。
    EXCLUDE_FROM_ALL:这个库不会被默认构建,除非有其他的组件依赖或者手工构建。
    上述例子中,
    add_library(StaticBubble SHARED src/StaticBubble.cpp) #STATIC or SHARED
    这句话就是生成了libStaticBubble.so

    CMakeLists语法3:add_executable 使用指定的源文件来生成目标可执行文件

    add_executable(Static_Lib src/testBubble.cpp)

    add_executable (<name> [WIN32] [MACOSX_BUNDLE]
          [EXCLUDE_FROM_ALL]
          [source1] [source2 ...])
    add_executable (<name> IMPORTED [GLOBAL])
    add_executable (<name> ALIAS <target>)
    

    使用指定的源文件来生成目标可执行文件。这里的目标可执行文件分为三类:普通可执行目标文件、导入可执行目标文件、别名可执行目标文件。分别对应上面的三种命令格式。

    target_link_libraries(Static_Lib StaticBubble)

    target_link_libraries(<target> [item1] [item2] [...]
                          [[debug|optimized|general] <item>] ...)
    

    该指令的作用为将目标文件与库文件进行链接。上述指令中的是指通过add_executable()和add_library()指令生成已经创建的目标文件。而[item]表示库文件没有后缀的名字。默认情况下,库依赖项是传递的。当这个目标链接到另一个目标时,链接到这个目标的库也会出现在另一个目标的连接线上。这个传递的接口存储在interface_link_libraries的目标属性中,可以通过设置该属性直接重写传递接口。

    cmake 变量引用的方式 --- ${} 进行变量的引用

    使用 ${} 进行变量的引用。在 IF 等语句中,是直接使用变量名而不通过 ${} 取值。

    include_directories(${CMAKE_SOURCE_DIR}/include)
    
    add_executable(tmp_test tmp_test.cpp ${TMP1_SRC} ${TMP2_SRC} ${TMP3_SRC} ${TMP4_SRC} ${TMP5_SRC} ${TMP6_SRC})
    target_link_libraries(tmp_test ${TEST_LINK_LIBS})
    

    cmake 常用变量

    CMAKE_SOURCE_DIR 顶级CMakeLists.txt的文件夹

    设置编译选项

    CMAKE_C_FLAGS 设置 C 编译选项,也可以通过指令 ADD_DEFINITIONS()添加。
    CMAKE_CXX_FLAGS 设置 C++编译选项,也可以通过指令 ADD_DEFINITIONS()添加。
    例如:

    set(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} -Wreturn-type -Wfloat-equal")
    set(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} -Werror=empty-body -Werror=uninitialized")
    
    link_directories(directory1 directory2 ...)
    

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

    include_directories("/data_1/Anaconda1105/include")
    link_directories("/data_1/Anaconda1105/lib")
    

    opencv 库1

    find_package(OpenCV REQUIRED)
    include_directories("/home/yhl/software_install/opencv3.2/include")
    link_directories(${OpenCV_LIBRARIES_DIRS})
    
    CUDA_ADD_EXECUTABLE(julia_gpu julia_gpu.cu)
    SET_PROPERTY(TARGET julia_gpu  PROPERTY FOLDER chapter04)
    TARGET_LINK_LIBRARIES(julia_gpu ${OpenCV_LIBS})
    

    opencv 库2

    set(OpenCV_DIR "/home/yhl/software_install/opencv3.2/share/OpenCV")
    find_package(OpenCV REQUIRED)
    include_directories(${OpenCV_INCLUDE_DIRS})
    
    CUDA_ADD_EXECUTABLE(julia_gpu julia_gpu.cu)
    SET_PROPERTY(TARGET julia_gpu  PROPERTY FOLDER chapter04)
    TARGET_LINK_LIBRARIES(julia_gpu ${OpenCV_LIBS})
    
  • 相关阅读:
    0x00000090 该内存不能read written
    AutoCAD系统变量:EDGEMODE
    AutoCAD.net: DoubleClick
    Access 类型转换函数
    无法更改文件夹的隐藏属性 解决方法!
    Windows防火墙无法启动解决办法
    AutoCAD.net: DrawOrderChange display order of the entities in the drawing
    C#调用C++编写的COM DLL
    编辑AutoCAD 2010中新出现的CUIx文件[转]
    hook钩子
  • 原文地址:https://www.cnblogs.com/yanghailin/p/14231780.html
Copyright © 2011-2022 走看看