zoukankan      html  css  js  c++  java
  • Ubuntu下使用cmake生成可执行文件

    1.单个CPP文件的cmake

    首先编写一个简单的程序(main.cpp):

    #include <iostream>
    using namespace std;
    int main()
    {
      cout<<"hello cmake"<<endl;
      return 0;
    }

    编写 CMakeLists.txt,并与main.cpp 放在同一个目录。

    project(hello)
    add_executable(hello main.cpp)

    进入CMakeLists.txt所在目录,在CMakeLists.txt 所在的目录下创建一个 build目录,进入build目录输入:

    cmake ..
    make

    执行完毕后,在 build 目录下会有很多编译出来的文件,但是只需要其中的可执行文件,如果要把可执行文件放到与 build 目录同级的 bin 文件夹下,那么在CMakeLists.txt 的最后加上下面这两句话:

    set( CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/bin/")
    install(TARGETS hello RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})

    将 make 指令改为make install,执行完毕后,就可以在 bin 文件夹中看到可执行文件 hello。

    注意:上述语句不能直接写成:

    install(TARGETS hello RUNTIME DESTINATION bin)

    会产生错误:

    CMake Error at cmake_install.cmake:42 (FILE):
      file INSTALL cannot copy file “XXXX” to "XXXX"

    因为默认路径前缀为/usr/local/

    若不手动改路径前缀则会出现将项目install到/usr/local/bin而没有权限的情况。

    2.引入data文件夹

    如果可执行文件需要调用一些文件,假设文件在 data 文件夹中,且 data 与CMakeLists.txt 在同级目录,则可以通过如下语句将 data 文件夹也放入 bin 文件夹

    install(DIRECTORY data DESTINATION ${CMAKE_INSTALL_PREFIX})

    3.多个CPP和H文件的cmake

    如果 main.cpp 中用到了另一个文件的内容,文件目录如下图,应该怎么办呢?


    其中 hello.h 为类的声明,hello.cpp 为类函数的定义。
    这时可以把 CMakeLists.txt 改为下面这样:

    project(hello)
    set(SRCS main.cpp hello.cpp)
    add_executable(hello ${SRCS})

    上述代码等价于:

    project(hello)
    add_executable(hello main.cpp hello.cpp)

    如果 hello.cpp 与 main.cpp 不在同一个文件夹呢?如下所示


    这时候每个文件夹下都要有一个 CMakeLists.txt。
    其中 main.cpp 同级目录下的 CMakeLists.txt 如下:

    project(hello)
    add_executable(hello main.cpp)
    target_link_libraries(hello header)

    Hello 目录下的 CMakeLists.txt 如下:

    add_library(header STATIC hello.cpp)

    说明:第一个 CMakeLists.txt 中的 add_subdirectory(Hello)表示在编译时要包含Hello这个目录,而 target_link_libraries(hello header)表示在生成 hello 时要调用静态链接库 header ,而 header 是在 Hello 目录下的 CMakeLists.txt 中的add_library(header STATIC hello.cpp)中产生的。

    同理,如果 hello.cpp 中使用了其它链接库里的东西,则在其 CMakeLists.txt 也要加入 target_link_libraries(header xxx)。
    注意:在写 target_link_libraries 语句时,括号里面的第一名称必须是当前所需要生成文件的名称,比如上面的 hello 和 header。但是,这样写在引用头文件时要写成 #include “Hello/hello.h”, 显得过长,这时,可以在 CMakeLists.txt 中加入下面这句话:

    include_directories(./Hello)

    这样引用头文件就可以写成 #include “hello.h”
    更多使用方法自行百度。

  • 相关阅读:
    乐器、音乐与声学
    函数的功能与坐标轴的理解
    函数的功能与坐标轴的理解
    波、波长与频率
    波、波长与频率
    长方体的研究
    彻底理解线索二叉树
    SSH框架总结(框架分析+环境搭建+实例源代码下载)
    深入浅出WPF 第一部分(3)
    iPad 3g版完美实现打电话功能(phoneitipad破解)
  • 原文地址:https://www.cnblogs.com/DLarTisan/p/7100166.html
Copyright © 2011-2022 走看看