关于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
文件格式如下,有build、doc、include、libraries、ser文件夹,其中在工程目录下有CMakeLists.txt文件是用于cmake
编辑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
修改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)
# 最低版本号为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来完成交叉编译功能。
在CMakeLists.txt中前面的位置直接添加
set (CMAKE_C_COMPILER "/usr/local/gcc/bin/gcc")
或
set (CMAKE_CXX_COMPILER "/usr/local/gcc/bin/g++")
本次利用gcc交叉编译工具和cmake结合来实现交叉编译
# 最低版本号为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})
可以看到在build文件下生成main可执行文件,通过查看其属性可以知道该文件是在ARM平台32位的可执行文件。
方法一:
在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 ../