zoukankan      html  css  js  c++  java
  • CMake编译linux C++

    CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CmakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。

     

      CMake 可以编译源代码、制作程式库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。CMake 支援 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake 也支援静态与动态程式库的建构。

     

      “CMake”这个名字是“cross platform make”的缩写。虽然名字中含有“make”,但是CMake和Unix上常见的“make”系统是分开的,而且更为高阶。

    [cmake 命令]
    cmake .
    make
    make clean

    重新编译,需要删除cmake的遗留文件
    推荐编写shell脚本处理这点简单但是将会伴随着你无数次的事情

    [clear cmake file shell]

    echo "rm cmake cache begin..."
    rm ./cmake_install.cmake
    rm -r ./CMakeFiles
    rm ./Makefile
    rm ./CMakeCache.txt
    echo "rm cmake cache end..."

    [内部编译]

    //CMakeLists.txt文件内容如下:
    PROJECT (HELLO)      //工程名HELLO
    SET(SRC_LIST main.c) //显示定义变量,并赋值
    MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
    MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
    ADD_EXECUTABLE(hello ${SRC_LIST})
    PROJECT指令的语法是:
    PROJECT(projectname [CXX] [C] [Java])

    SET(SRC_LIST main.c),如果有多个源文件,也可以定义成:SET(SRC_LIST main.c t1.c t2.c)。
    MESSAGE指令的语法是:
    MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"
    ...)
    这个指令用于向终端输出用户定义的信息,包含了三种类型:
    SEND_ERROR,产生错误,生成过程被跳过。
    SATUS,输出前缀为—的信息。
    FATAL_ERROR,立即终止所有cmake过程.

    HELLO_BINARY_DIR和HELLO_SOURCE_DIR是两个隐式变量

    make clean即可对构建结果进行清理

    [外部编译]

    构建
    1,为工程添加一个子目录src,用来放置工程源代码;
    2,添加一个子目录doc,用来放置这个工程的文档hello.txt
    3,在工程目录添加文本文件COPYRIGHT, README;
    4,在工程目录添加一个runhello.sh脚本,用来调用hello二进制
    4,将构建后的目标文件放入构建目录的bin子目录;
    5,最终安装这些文件:将hello二进制与runhello.sh安装至/usr/bin,将doc目录的内容以及
    COPYRIGHT/README安装到/usr/share/doc/cmake/t2


    ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})就可以构建一个libhello_static.a的静态库了。


    [CMakeList 例子]

    PROJECT(PRONAME)  //工程名

    SET(CMAKE_C_COMPILER "g++")  //选择编译器,默认是gcc

    AUX_SOURCE_DIRECTORY(./ SRC_LIST) //添加源码目录
    SET(EXECUTABLE_OUTPUT_PATH ../bin) //添加bin文件生成路径

    ADD_DEFINITIONS(-g -W -Wall -DTIXML_USE_STL)
    //ADD_DEFINITIONS添加一些宏,根据自己的程序需要

    //添加头文件路径
    INCLUDE_DIRECTORIES(
    ./
    /home/hfx/src
    )

    //添加链接库路径
    LINK_DIRECTORIES(
    /usr/local/mysql/lib/mysql
    )

    //生成二进制文件
    ADD_EXECUTABLE(helloworld ${SRC_LIST})
    //生成LIB
    ADD_LIBRARY(helloworld2 ${SRC_LIST})

    //链接库
    TARGET_LINK_LIBRARIES(mysqlclient_r)

    //代码位置无关宏  -fPIC
    位置无关代码段的优点:
    1.简化设计,方便实现系统的快速引导。位置无关代码可以避免在引导时进行地址映射,并方便地跳转到RAM中实现快速引导
    2.实现复位处理智能化。位置无关的代码可以被加载到任意地址空间运行
    3.便于调试。Bootloader的调试通常也是一个繁琐的过程,使用位置无关代码,则可以将映像文件加载到RAM中进行调试,
    这既能真实地反映程序从ROM中  进行系统引导的情况,又可以避免频繁烧写程序存储器。

  • 相关阅读:
    边走边学Nodejs (基础入门篇)
    Android应用打包安装过程具体解释
    ubuntu与centos安装软件的不同点总结
    你好,C++(12)怎样管理多个类型同样性质同样的数据?3.6 数组
    oracle暂时表空间 ORA-01652:无法通过16(在表空间XXX中)扩展 temp 字段
    iOS中sqlite3操作
    sparkSQL1.1入门之二:sparkSQL执行架构
    [NHibernate]视图处理
    [NHibernate]立即加载
    [NHibernate]延迟加载
  • 原文地址:https://www.cnblogs.com/wangbin/p/4950747.html
Copyright © 2011-2022 走看看