首先要安装cmake

然后安装交叉编译链

一、CMake简介:

CMake是一个跨平台的安装(编译)工具,可以通过简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件。

 

二、CMake命令

CMake的语句都写在一个叫做CMakeLists.txt的文件里。常见的CMake内置变量和命令如下:


 

查看已安装好的cmake版本,我安装的是3.11.1版本

使用cmake编译android程序 如何使用cmake编译_#include

三、具体编译使用

(1)在atest/t1下写一个简单的main程序和对应的CMakeLists.txt文件。



Main.c内容如下:

#include<stdio.h>
int main()
{         
printf("hello from t1 mian!\n");
return 0;
}

CMakeLists.txt内容如下:

CMake_minimum_required(VERSION 3.11)
PROJECT(HELLO)
SET(SRC_LIST main.c)
ADD_EXECUTABLE(hello ${SRC_LIST})



 

进行编译:

cmake .       //指定的是CMakeLists.txt所在目录
make
./hello

 

使用cmake编译android程序 如何使用cmake编译_txt文件_02

验证,结果正确。

使用cmake编译android程序 如何使用cmake编译_使用cmake编译android程序_03

 

此时t1文件夹中多了几个文件:

使用cmake编译android程序 如何使用cmake编译_使用cmake编译android程序_04

也可以查看hello的属性

使用cmake编译android程序 如何使用cmake编译_CMake_05

 

(2)t1中默认生成的是x86,我们也可以自己添加语句来选择

建立atest/t2文件夹,main.c和CMakeLists.txt文件,main.c文件内容不变

CMakeLists.txt如下

 

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_C_COMPILER /home/amm/software/arm-2014.05/bin/arm-none-linux-gnueabi-gcc)
SET(CMAKE_CXX_COMPILER /home/amm/software/arm-2014.05/bin/arm-none-linux-gnueabi-c++)

 

PROJECT(HELLO)
SET(SRC_LIST main.c)
ADD_EXECUTABLE(hello ${SRC_LIST})

 

使用cmake编译android程序 如何使用cmake编译_linux_06

进行编译

cmake .

make

 

使用cmake编译android程序 如何使用cmake编译_linux_07

此时文件夹内容

使用cmake编译android程序 如何使用cmake编译_CMake_08

再次查看hello属性

使用cmake编译android程序 如何使用cmake编译_#include_09

 

(3)t1 和 t2 都是内部编译,我们其实是不希望编译文件与源文件混在一起的,故建立build文件夹,使编译都在build文件夹内进行



#include<stdio.h>
 
int main()
{         
printf("hello from t3 mian!\n");
return 0;
}
CMake_minimum_required(VERSION 3.11)
PROJECT(HELLO)
SET(SRC_LIST main.c)
ADD_EXECUTABLE(hello ${SRC_LIST})



使用cmake编译android程序 如何使用cmake编译_CMake_10

 

此时进入build目录下进行编译

使用cmake编译android程序 如何使用cmake编译_txt文件_11

此时目录情况

使用cmake编译android程序 如何使用cmake编译_#include_12

Build中:

使用cmake编译android程序 如何使用cmake编译_linux_13

达到目的。

 (4)当有多个文件时main.c hello.c hello.h



// hello.c
#include <stdio.h>
#include "hello.h"
 
void hello(const char* name)
{         
printf("HELLO %s!\n",name);
}
//hello.h
#ifndef AMM_HELLO_
#define AMM_HELLO_
void hello(const char* name);
#endif
//CMakeLists.txt
project(A2)
set(SRC_LIST main.c hello.c)
add_executable(A2 ${SRC_LIST})
//main.c
#include "hello.h"
int main()
{         
hello("World");
return 0;
}



使用cmake编译android程序 如何使用cmake编译_CMake_14

编译过程

使用cmake编译android程序 如何使用cmake编译_使用cmake编译android程序_15

使用cmake编译android程序 如何使用cmake编译_CMake_16

(5)将hello生成库文件,只需要将CMakeLists.txt文件改一下:



project(A3)
set(LIB_SRC hello.c)
set(APP_SRC main.c)
add_library(hello ${LIB_SRC})
add_executable(A3 ${APP_SRC})
target_link_libraries(A3 hello)



编译过程一样,可以看到在build文件夹中多了.a静态库文件

使用cmake编译android程序 如何使用cmake编译_#include_17

(6)将源文件、库文件分别放入src和libhello不同文件夹中,并将生成的可执行文件放入build/bin中,生成的库文件放入build/lib中

使用cmake编译android程序 如何使用cmake编译_txt文件_18

需要写三个CMakeLists.txt文件,A5中,libhello中,src中



// libhello中的CMakeLists.txt
set(LIB_SRC hello.c)
add_library(libhello ${LIB_SRC})
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
// src中的CMakeLists.txt
include_directories(${PROJECT_SOURCE_DIR}/libhello)
set(APP_SRC main.c)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
add_executable(A5 ${APP_SRC})
target_link_libraries(A5 libhello)
// A5中的CMakeLists.txt
CMake_minimum_required(VERSION 3.11)
project(A5)
 
add_subdirectory(src)
add_subdirectory(libhello)



进行编译

使用cmake编译android程序 如何使用cmake编译_linux_19

使用cmake编译android程序 如何使用cmake编译_使用cmake编译android程序_20

观察后相应文件在相应设定的文件夹中

使用cmake编译android程序 如何使用cmake编译_linux_21

此时生成的是.a静态库,如果想生成动态库,则改动一下libhello中CMakeLists.txt文件

使用cmake编译android程序 如何使用cmake编译_linux_22

将第二行中加入SHARED就生成的是动态库了

使用cmake编译android程序 如何使用cmake编译_使用cmake编译android程序_23

四、其他

例如如何加入第三方库,没找到合适的例子

使用cmake编译android程序 如何使用cmake编译_#include_24

通过上边的语句应该可以达到目的。

 

后来补充:

例如:

有现成的lib库为libqueue.a和其对应的头文件queue.h

使用cmake编译android程序 如何使用cmake编译_linux_25

  1. 建立main文件,和写对应的CMakeLists.txt文件
//CmakeLists.txt
cmake_minimum_required(VERSION 3.11)
 
project(testQ)
set(INK_DIR /home/amm/atest/testQ)
set(LINK_DIR /home/amm/atest/testQ)
set(SOURCE_FILES main.c)
 
include_directories(${INK_DIR})
link_directories(${LINK_DIR})
add_executable(testQ main.c)
target_link_libraries(testQ libqueue.a)
//main.c
1. #include "queue.h"
2. #include <stdio.h>
3. #include <stdlib.h>
4.  
5.  
6. int main()
7. {          
8. sp_queue q = init();
9. void* x = (void*)"abc";
10.  
11. //void* x = (void*)99;
12.  
13.  
14. push(&q,x);
15. printf("入队元素为:%s\n",x);
16.  
17. printf("队列长度:%d\n",size(q));
18.  
19.  
20. pop(&q, &x);//出队列
21. printf("出队:%s\n", x);
22.  
23.  
24. return 0;
25. }



 

2.进入终端,在空文件夹build下:

Cmake ..

Make

./testQ

 

使用cmake编译android程序 如何使用cmake编译_CMake_26

可以发现,成功。




首先要安装cmake

然后安装交叉编译链

一、CMake简介:

CMake是一个跨平台的安装(编译)工具,可以通过简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件。

 

二、CMake命令

CMake的语句都写在一个叫做CMakeLists.txt的文件里。常见的CMake内置变量和命令如下:


 

查看已安装好的cmake版本,我安装的是3.11.1版本

使用cmake编译android程序 如何使用cmake编译_#include

三、具体编译使用

(1)在atest/t1下写一个简单的main程序和对应的CMakeLists.txt文件。



CMakeLists.txt内容如下:
CMake_minimum_required(VERSION 3.11)
PROJECT(HELLO)
SET(SRC_LIST main.c)
ADD_EXECUTABLE(hello ${SRC_LIST})
Main.c内容如下:
#include<stdio.h>
int main()
{         
printf("hello from t1 mian!\n");
return 0;
}



 

进行编译:

cmake .       //指定的是CMakeLists.txt所在目录

make

./hello

 

使用cmake编译android程序 如何使用cmake编译_txt文件_02

验证,结果正确。

使用cmake编译android程序 如何使用cmake编译_使用cmake编译android程序_03

 

此时t1文件夹中多了几个文件:

使用cmake编译android程序 如何使用cmake编译_使用cmake编译android程序_04

也可以查看hello的属性

使用cmake编译android程序 如何使用cmake编译_CMake_05

 

(2)t1中默认生成的是x86,我们也可以自己添加语句来选择

建立atest/t2文件夹,main.c和CMakeLists.txt文件,main.c文件内容不变

CMakeLists.txt如下

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_C_COMPILER /home/amm/software/arm-2014.05/bin/arm-none-linux-gnueabi-gcc)
SET(CMAKE_CXX_COMPILER /home/amm/software/arm-2014.05/bin/arm-none-linux-gnueabi-c++)
 
PROJECT(HELLO)
SET(SRC_LIST main.c)
ADD_EXECUTABLE(hello ${SRC_LIST})

 

使用cmake编译android程序 如何使用cmake编译_linux_06

进行编译

cmake .

make

 

使用cmake编译android程序 如何使用cmake编译_linux_07

此时文件夹内容

使用cmake编译android程序 如何使用cmake编译_CMake_08

再次查看hello属性

使用cmake编译android程序 如何使用cmake编译_#include_09

 

(3)t1 和 t2 都是内部编译,我们其实是不希望编译文件与源文件混在一起的,故建立build文件夹,使编译都在build文件夹内进行



CMake_minimum_required(VERSION 3.11)
PROJECT(HELLO)
SET(SRC_LIST main.c)
ADD_EXECUTABLE(hello ${SRC_LIST})
#include<stdio.h>
 
int main()
{         
printf("hello from t3 mian!\n");
return 0;
}



使用cmake编译android程序 如何使用cmake编译_CMake_10

 

此时进入build目录下进行编译

使用cmake编译android程序 如何使用cmake编译_txt文件_11

此时目录情况

使用cmake编译android程序 如何使用cmake编译_#include_12

Build中:

使用cmake编译android程序 如何使用cmake编译_linux_13

达到目的。

 (4)当有多个文件时main.c hello.c hello.h



// hello.c
#include <stdio.h>
#include "hello.h"
 
void hello(const char* name)
{         
printf("HELLO %s!\n",name);
}
//hello.h
#ifndef AMM_HELLO_
#define AMM_HELLO_
void hello(const char* name);
#endif
//CMakeLists.txt
project(A2)
set(SRC_LIST main.c hello.c)
add_executable(A2 ${SRC_LIST})
//main.c
#include "hello.h"
int main()
{         
hello("World");
return 0;
}



使用cmake编译android程序 如何使用cmake编译_CMake_14

编译过程

使用cmake编译android程序 如何使用cmake编译_使用cmake编译android程序_15

使用cmake编译android程序 如何使用cmake编译_CMake_16

(5)将hello生成库文件,只需要将CMakeLists.txt文件改一下:



project(A3)
set(LIB_SRC hello.c)
set(APP_SRC main.c)
add_library(hello ${LIB_SRC})
add_executable(A3 ${APP_SRC})
target_link_libraries(A3 hello)



编译过程一样,可以看到在build文件夹中多了.a静态库文件

使用cmake编译android程序 如何使用cmake编译_#include_17

(6)将源文件、库文件分别放入src和libhello不同文件夹中,并将生成的可执行文件放入build/bin中,生成的库文件放入build/lib中

使用cmake编译android程序 如何使用cmake编译_txt文件_18

需要写三个CMakeLists.txt文件,A5中,libhello中,src中



// libhello中的CMakeLists.txt
set(LIB_SRC hello.c)
add_library(libhello ${LIB_SRC})
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
// src中的CMakeLists.txt
include_directories(${PROJECT_SOURCE_DIR}/libhello)
set(APP_SRC main.c)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
add_executable(A5 ${APP_SRC})
target_link_libraries(A5 libhello)
// A5中的CMakeLists.txt
CMake_minimum_required(VERSION 3.11)
project(A5)
 
add_subdirectory(src)
add_subdirectory(libhello)



进行编译

使用cmake编译android程序 如何使用cmake编译_linux_19

使用cmake编译android程序 如何使用cmake编译_使用cmake编译android程序_20

观察后相应文件在相应设定的文件夹中

使用cmake编译android程序 如何使用cmake编译_linux_21

此时生成的是.a静态库,如果想生成动态库,则改动一下libhello中CMakeLists.txt文件

使用cmake编译android程序 如何使用cmake编译_linux_22

将第二行中加入SHARED就生成的是动态库了

使用cmake编译android程序 如何使用cmake编译_使用cmake编译android程序_23

四、其他

例如如何加入第三方库,没找到合适的例子

使用cmake编译android程序 如何使用cmake编译_#include_24

通过上边的语句应该可以达到目的。

 

后来补充:

例如:

有现成的lib库为libqueue.a和其对应的头文件queue.h

使用cmake编译android程序 如何使用cmake编译_linux_25

  1. 建立main文件,和写对应的CMakeLists.txt文件
//CmakeLists.txt
cmake_minimum_required(VERSION 3.11)
 
project(testQ)
set(INK_DIR /home/amm/atest/testQ)
set(LINK_DIR /home/amm/atest/testQ)
set(SOURCE_FILES main.c)
 
include_directories(${INK_DIR})
link_directories(${LINK_DIR})
add_executable(testQ main.c)
target_link_libraries(testQ libqueue.a)
//main.c
1. #include "queue.h"
2. #include <stdio.h>
3. #include <stdlib.h>
4.  
5.  
6. int main()
7. {          
8. sp_queue q = init();
9. void* x = (void*)"abc";
10.  
11. //void* x = (void*)99;
12.  
13.  
14. push(&q,x);
15. printf("入队元素为:%s\n",x);
16.  
17. printf("队列长度:%d\n",size(q));
18.  
19.  
20. pop(&q, &x);//出队列
21. printf("出队:%s\n", x);
22.  
23.  
24. return 0;
25. }



 

2.进入终端,在空文件夹build下:

Cmake ..

Make

./testQ

 

使用cmake编译android程序 如何使用cmake编译_CMake_26

可以发现,成功。