linux 下Cmake 的使用

简介:

关于cmake和make的区别自行去搜索其它文章,本博文主要目的是对cmake的应用

/* main.c */
#include "main.h"

int main(void)
{
    int a, b;
    printf("input two number:\n");
    scanf("%d", &a);
    scanf("%d", &b);
    printf("%d + %d = %d\n", a, b, add(a, b));
    printf("%d * %d = %d\n", a, b, mul(a, b));

    return 0;
}
/* main.h */
#ifndef __MAIN_H
#define __MAIN_H

#include "add.h"
#include "mul.h"

#include 
#include 
#include 

#endif
/*add.c*/
#include "add.h"

int add(int a, int b)
{
    return a + b;
}
/*add.h*/
#ifndef __ADD_H
#define __ADD_H

#include "main.h"

int add(int a, int b);

#endif
/*mul.c*/
#include "mul.h"

int mul(int a, int b)
{
    return a * b;
}
/*mul.h*/
#ifndef __MUL_H
#define __MUL_H

#include "main.h"
int mul(int a, int b);

#endif

对c/c++文件进行编译

文件格式如下,有build、doc、include、libraries、ser文件夹,其中在工程目录下有CMakeLists.txt文件是用于cmake
linux 下Cmake 的使用_第1张图片
编辑CMakeLists.txt文件

cmake_minimum_required (VERSION 2.8)                    # 最低要求cmake版本为2.8

project (main)                                          # 工程名字,也是可执行文件的名字

aux_source_directory(./ser SER_LIST)                    # 指定源文件的路径文件夹
include_directories(./include INCLUDE_LIST)             # 指定头文件的路径文件夹

add_executable(main ${SER_LIST} ${INCLUDE_LIST})        # 运行make后生成可执行文件main

在build文件夹下执行下面命令,通过表示编译成功会生成可执行文件 main

cmake..
make

linux 下Cmake 的使用_第2张图片

生成动态库(.so)和静态库(.a)文件

单个.c和.h生成链接库

修改CMakeLists.txt文件

# 最低版本号为2.8
cmake_minimum_required (VERSION 2.8)
# 工程名字:main
project (main)
# 指定头文件路径,PROJECT_SOURCE_DIR是在工程路径下的意思
# 也就是CMakeLists.txt文件的当前路径
include_directories(${PROJECT_SOURCE_DIR}/include/)
# 生成动态库 .so 文件
add_library(add_shared SHARED ${PROJECT_SOURCE_DIR}/ser/add.c)
# 生成静态库 .a 文件
add_library(add_static STATIC ${PROJECT_SOURCE_DIR}/ser/add.c)
# 给动态库和静态库起个名字,只要是标明库的版本号
set_target_properties(add_shared PROPERTIES OUTPUT_NAME "add")
set_target_properties(add_static PROPERTIES OUTPUT_NAME "add")
# 指定生成的库文件存放路径
set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/libraries)

多个.c和.h生成链接库

# 最低版本号为2.8
cmake_minimum_required (VERSION 2.8)
# 工程名字:main
project (main)

#可以指定多个头文件地址
include_directories(${PROJECT_SOURCE_DIR}/include/
                    ${PROJECT_SOURCE_DIR}/)

# 指定多个 .c 文件
# 生成动态库 .so 文件
add_library(Shared SHARED ${PROJECT_SOURCE_DIR}/ser/add.c
                          ${PROJECT_SOURCE_DIR}/ser/mul.c)
                              
# 生成静态库 .a 文件
add_library(Static STATIC ${PROJECT_SOURCE_DIR}/ser/add.c 
                          ${PROJECT_SOURCE_DIR}/ser/mul.c)

# 给动态库和静态库起个名字,只要是标明库的版本号
set_target_properties(Shared PROPERTIES OUTPUT_NAME "mul")
set_target_properties(Static PROPERTIES OUTPUT_NAME "mul")

# 指定生成的库文件存放路径
set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/libraries)

把动态库、静态库链接起来

# 最低版本号为2.8
cmake_minimum_required (VERSION 2.8)
# 工程名字:main
project (main)

# 指定头文件路径,可以指定多个路径
include_directories (${PROJECT_SOURCE_DIR}/include
                     ${PROJECT_SOURCE_DIR}/)
# 指定编译的源文件,即 .c 文件
aux_source_directory(${PROJECT_SOURCE_DIR}/ser SER_LIST)
# 链接指定的库和表明库的路径
find_library(LIB  mul HINTS ${PROJECT_SOURCE_DIR}/libraries)
# make编译生成可执行文件
add_executable(main ${SER_LIST})
# 把目标文件与库文件进行链接
target_link_libraries(main ${LIB})
在libraries中有libmul.so 和 libmul.a 两个
在find_library(LIB  mul HINTS ${PROJECT_SOURCE_DIR}/libraries)中默认优先链接动态库
若想要连接静态库需要把 find_library 中的 mul 改为 libmul.a 即可

cmake指定编译器

cmake可以指定编译器来编译文件,所以可以使用cmake来完成交叉编译功能。
在CMakeLists.txt中前面的位置直接添加

set (CMAKE_C_COMPILER "/usr/local/gcc/bin/gcc")
或
set (CMAKE_CXX_COMPILER "/usr/local/gcc/bin/g++")

本次利用gcc交叉编译工具和cmake结合来实现交叉编译

linux 下Cmake 的使用_第3张图片

# 最低版本号为2.8
cmake_minimum_required (VERSION 2.8)
# 工程名字:main
project (main)

# 指定编译器,第二个参数为编译器的绝对路径
set(CMAKE_C_COMPILER "/home/book/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc")


# 指定头文件路径,可以指定多个路径
include_directories (${PROJECT_SOURCE_DIR}/include)

# 指定编译的源文件,即 .c 文件
aux_source_directory(${PROJECT_SOURCE_DIR}/ser SER_LIST)

# 链接指定的库和表明库的路径
find_library(LIB add mul HINTS ${PROJECT_SOURCE_DIR}/libraries)

# make编译生成可执行文件
add_executable(main ${SER_LIST})

# 把目标文件与库文件进行链接
target_link_libraries(main ${LIB})

linux 下Cmake 的使用_第4张图片
可以看到在build文件下生成main可执行文件,通过查看其属性可以知道该文件是在ARM平台32位的可执行文件。
linux 下Cmake 的使用_第5张图片

cmake下支持gdb调试功能

方法一:
在CMakeLists.txt里的头部添加下列三行语句,然后编译方式不变……

SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

方法二:
用下列命令进行编译

cmake -DCMAKE_BUILD_TYPE=Debug Path 
# Path 是CMakeLists.txt的路径
# 例:cmake -DCMAKE_BUILD_TYPE=Debug ../

你可能感兴趣的:(Linux,嵌入式,linux,c++,c语言)