int main (int argc, char *argv[]) {
if (argc < 2)
{
fprintf(stdout,“%s Version %d.%d\n”,
argv[0],
// 使用了 cmake 生成的配置参数
Tutorial_VERSION_MAJOR,
Tutorial_VERSION_MINOR);
fprintf(stdout,“Usage: %s number\n”,argv[0]);
return 1;
}
double inputValue = atof(argv[1]);
double outputValue = sqrt(inputValue);
fprintf(stdout,“The square root of %g is %g\n”,
inputValue, outputValue);
return 0;
}
// 这个是配置文件,cmake 会根据他在 cmake 的 build 目录生成一个 TutorialConfig.h 文件
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR
(2).添加库的依赖
- 1.我们进入项目的 two/a/mylib 中会看见三个文件 CMakeLists.txt、mysqrt.cpp、MathFunctions.h 代码如下:
- 1.声明了一个 library
- 2.定义了一个计算平方根的函数,然后使用头文件暴露在外面
cmake_minimum_required (VERSION 2.6)
声明了一个 library 名为 MathFunctions,他包含一个可执行文件 mysqrt.cpp
add_library(MathFunctions mysqrt.cpp)
#include “MathFunctions.h”
#include <stdio.h>
// a hack square root calculation using simple operations
double mysqrt(double x) {
if (x <= 0) {
return 0;
}
double result;
double delta;
result = x;
// do ten iterations
int i;
for (i = 0; i < 10; ++i) {
if (result <= 0) {
result = 0.1;
}
delta = x - (result * result);
result = result + 0.5 * delta / result;
fprintf(stdout, “Computing sqrt of %g to be %g\n”, x, result);
}
return result;
}
//
// Created by 何时夕 on 2018/11/11.
//
#ifndef PROJECT_MATHFUNCTIONS_H
#define PROJECT_MATHFUNCTIONS_H
double mysqrt(double x);
#endif //PROJECT_MATHFUNCTIONS_H
- 2.然后我们再看看 two/a 这个目录下面的文件,这些文件大部分是从 one/b 中拷贝来的,我就只贴有修改的部分 CMakeLists.txt、Configure.h.in、MathFunctions.h、tutorial.cpp:
- 1.这里主要做的工作是现在 cmake 文件中定义了一个 USE_MYMATH 的开关,当这个开关为 ON 的时候就将我们定义的 library 集成到 project 中,否则就不集成,只使用系统自带的库。这个东西在跨平台的时候非常有用,比如 ios 和 android 中的 log 库不同,那么我就可以定义一个开关来区别这两个平台。
- 2.可以注意到的是这里也定义了一个 Configure.h.in 文件作为配置文件,cmake 会根据这个文件来创建一个 Configure.h 文件,然后我们就可以在 Cpp 文件中使用我们定义的开关了。
- 3.我们可以在 two/a/build 中运行 cmake…、make、./Tutorial_Mylib 3 这几个命令,会发现最终调用的是我们自己的函数,如果将 USE_MYMATH 改成 OFF 然后删除 build 中的文件再重新 build 一遍,会发现最后调用的是系统的函数。
cmake_minimum_required (VERSION 2.6)
project (Tutorial_Mylib)
set (Tutorial_VERSION_MAJOR 1)
set (Tutorial_VERSION_MINOR 0)
configure_file (
“
P
R
O
J
E
C
T
S
O
U
R
C
E
D
I
R
/
T
u
t
o
r
i
a
l
C
o
n
f
i
g
.
h
.
i
n
"
"
{PROJECT_SOURCE_DIR}/TutorialConfig.h.in" "
PROJECTSOURCEDIR/TutorialConfig.h.in""{PROJECT_BINARY_DIR}/TutorialConfig.h”
)
添加一个是否使用我们自己的库的开关 USE_MYMATH,这个开关可以在 cmake 中直接使用
option (USE_MYMATH
“Use tutorial provided math implementation” ON)
定义一个文件来储存 USE_MYMATH,以便在 cpp 文件中使用
configure_file(“ P R O J E C T S O U R C E D I R / C o n f i g u r e . h . i n " " {PROJECT_SOURCE_DIR}/Configure.h.in" " PROJECTSOURCEDIR/Configure.h.in""{PROJECT_BINARY_DIR}/Configure.h”)
include_directories(“${PROJECT_BINARY_DIR}”)
如果我们把开关设置为 ON,那么就将 mylib 集成进编译中,否则就不集成。
if (USE_MYMATH)
include_directories (“${PROJECT_SOURCE_DIR}/mylib”)
add_subdirectory (mylib)
set (EXTRA_LIBS MathFunctions)
endif (USE_MYMATH)
add_executable (Tutorial_Mylib tutorial.cpp)
将library 与 project 进行链接,使得 project 中可以调用 library 中的函数
target_link_libraries (Tutorial_Mylib ${EXTRA_LIBS})
#cmakedefine USE_MYMATH
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include “TutorialConfig.h”
#include “Configure.h”
#ifdef USE_MYMATH
#include “MathFunctions.h”
#endif
int main (int argc, char *argv[]) {
if (argc < 2)
{
fprintf(stdout,“%s Version %d.%d\n”, argv[0],
Tutorial_VERSION_MAJOR,
Tutorial_VERSION_MINOR);
fprintf(stdout,“Usage: %s number\n”,argv[0]);
return 1;
}
double inputValue = atof(argv[1]);
#ifdef USE_MYMATH
// 如果开关开了,就使用我自己的库
double outputValue = mysqrt(inputValue);
fprintf(stdout,“use my math”);
#else
double outputValue = sqrt(inputValue);
fprintf(stdout,“not use my math”);
#endif
fprintf(stdout,“The square root of %g is %g\n”,
inputValue, outputValue);
return 0;
}
(2).添加库的依赖
- 1.我们进入项目的 two/a/mylib 中会看见三个文件 CMakeLists.txt、mysqrt.cpp、MathFunctions.h 代码如下:
- 1.声明了一个 library
- 2.定义了一个计算平方根的函数,然后使用头文件暴露在外面
cmake_minimum_required (VERSION 2.6)
声明了一个 library 名为 MathFunctions,他包含一个可执行文件 mysqrt.cpp
add_library(MathFunctions mysqrt.cpp)
#include “MathFunctions.h”
#include <stdio.h>
// a hack square root calculation using simple operations
double mysqrt(double x) {
if (x <= 0) {
return 0;
}
double result;
double delta;
result = x;
// do ten iterations
int i;
for (i = 0; i < 10; ++i) {
if (result <= 0) {
result = 0.1;
}
delta = x - (result * result);
result = result + 0.5 * delta / result;
fprintf(stdout, “Computing sqrt of %g to be %g\n”, x, result);
}
return result;
}
//
// Created by 何时夕 on 2018/11/11.
//
#ifndef PROJECT_MATHFUNCTIONS_H
#define PROJECT_MATHFUNCTIONS_H
double mysqrt(double x);
#endif //PROJECT_MATHFUNCTIONS_H
- 2.然后我们再看看 two/a 这个目录下面的文件,这些文件大部分是从 one/b 中拷贝来的,我就只贴有修改的部分 CMakeLists.txt、Configure.h.in、MathFunctions.h、tutorial.cpp:
- 1.这里主要做的工作是现在 cmake 文件中定义了一个 USE_MYMATH 的开关,当这个开关为 ON 的时候就将我们定义的 library 集成到 project 中,否则就不集成,只使用系统自带的库。这个东西在跨平台的时候非常有用,比如 ios 和 android 中的 log 库不同,那么我就可以定义一个开关来区别这两个平台。
- 2.可以注意到的是这里也定义了一个 Configure.h.in 文件作为配置文件,cmake 会根据这个文件来创建一个 Configure.h 文件,然后我们就可以在 Cpp 文件中使用我们定义的开关了。
- 3.我们可以在 two/a/build 中运行 cmake…、make、./Tutorial_Mylib 3 这几个命令,会发现最终调用的是我们自己的函数,如果将 USE_MYMATH 改成 OFF 然后删除 build 中的文件再重新 build 一遍,会发现最后调用的是系统的函数。
cmake_minimum_required (VERSION 2.6)
project (Tutorial_Mylib)
set (Tutorial_VERSION_MAJOR 1)
set (Tutorial_VERSION_MINOR 0)
configure_file (
“
P
R
O
J
E
C
T
S
O
U
R
C
E
D
I
R
/
T
u
t
o
r
i
a
l
C
o
n
f
i
g
.
h
.
i
n
"
"
{PROJECT_SOURCE_DIR}/TutorialConfig.h.in" "
PROJECTSOURCEDIR/TutorialConfig.h.in""{PROJECT_BINARY_DIR}/TutorialConfig.h”
)
添加一个是否使用我们自己的库的开关 USE_MYMATH,这个开关可以在 cmake 中直接使用
option (USE_MYMATH
“Use tutorial provided math implementation” ON)
定义一个文件来储存 USE_MYMATH,以便在 cpp 文件中使用
configure_file(“ P R O J E C T S O U R C E D I R / C o n f i g u r e . h . i n " " {PROJECT_SOURCE_DIR}/Configure.h.in" " PROJECTSOURCEDIR/Configure.h.in""{PROJECT_BINARY_DIR}/Configure.h”)
include_directories(“${PROJECT_BINARY_DIR}”)
如果我们把开关设置为 ON,那么就将 mylib 集成进编译中,否则就不集成。
if (USE_MYMATH)
include_directories (“${PROJECT_SOURCE_DIR}/mylib”)
add_subdirectory (mylib)
set (EXTRA_LIBS MathFunctions)
endif (USE_MYMATH)
add_executable (Tutorial_Mylib tutorial.cpp)
将library 与 project 进行链接,使得 project 中可以调用 library 中的函数
target_link_libraries (Tutorial_Mylib ${EXTRA_LIBS})
#cmakedefine USE_MYMATH
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include “TutorialConfig.h”
#include “Configure.h”
#ifdef USE_MYMATH
#include “MathFunctions.h”
#endif
int main (int argc, char *argv[]) {
if (argc < 2)
{
fprintf(stdout,“%s Version %d.%d\n”, argv[0],
Tutorial_VERSION_MAJOR,
Tutorial_VERSION_MINOR);
fprintf(stdout,“Usage: %s number\n”,argv[0]);
return 1;
}
double inputValue = atof(argv[1]);
#ifdef USE_MYMATH
// 如果开关开了,就使用我自己的库
double outputValue = mysqrt(inputValue);
fprintf(stdout,“use my math”);
#else
double outputValue = sqrt(inputValue);
fprintf(stdout,“not use my math”);
#endif
fprintf(stdout,“The square root of %g is %g\n”,
inputValue, outputValue);
return 0;
}
(3).安装库与可执行文件
- 1.我们进入项目的 three/a 文件夹中,这里面的文件都是从 two/a 中复制过来的,我只将增加的代码列一下mylib/CMakeLists.txt、a/CMakeLists.txt:
- 1.这里就比较简单了,就只是将我们生成的库与可执行文件安装到电脑中去
- 2.先依次运行cmake …、make、make install,然后可以运行 /usr/local/bin/Tutorial_Mylib_Install 3 来查看是否安装成功,注意这里的路径是 Mac 电脑的路径。
安装这个库,将库和头文件分别添加到 bin 和 include 文件夹中,最后移动到的地方如下
/usr/local/bin/libMathFunctions_Install.a
/usr/local/include/MathFunctions.h
install (TARGETS MathFunctions_Install DESTINATION bin)
install (FILES MathFunctions.h DESTINATION include)
TARGETS包含六种形式:ARCHIVE, LIBRARY, RUNTIME, OBJECTS, FRAMEWORK, BUNDLE。注意Mathfunction_Install安装的是LIBRARY,Tutorial_Mylib_Install 是RUNTIME类型。
FILE 将给定的文件复制到指定目录。如果没有给定权限参数,则由该表单安装的文件默认为OWNER_WRITE、OWNER_READ、GROUP_READ和WORLD_READ。
TARGETS和FILE可指定为相对目录和绝对目录。
DESTINATION在这里是一个相对路径,取默认值。在unix系统中指向 /usr/local 在windows上c:/Program Files/${PROJECT_NAME}。
也可以通过设置CMAKE_INSTALL_PREFIX这个变量来设置安装的路径,那么安装位置不指向/usr/local,而指向你所指定的目录。
安装这个可执行文件,将可执行文件和头文件分别添加到 bin 和 include 文件夹中,最后移动到的地方如下
/usr/local/bin/Tutorial_Mylib_Install
/usr/local/include/TutorialConfig.h
install (TARGETS Tutorial_Mylib_Install DESTINATION bin)
install (FILES “${PROJECT_BINARY_DIR}/TutorialConfig.h”
DESTINATION include)
(4).Cmake生成Cpp文件
- 1.我们进入 four/a 目录中,这里的代码都是从 two/a 中拷贝过来的,所以我就只贴修改的部分,mylib/CMakeLists.txt、mylib/MakeTable.cpp、a/Configure.h.in:
- 1.这里的目的主要是通过 MakeTable 这个 project 生成一个 Table.h。最后给 mysqrt.cpp 在当前系统中没有 log 和 exp 这两个函数的时候使用。
- 2.我们运行了 cmake… 之后会发现 build/mylib 目录中生成了 Table.h 这个文件
project(MakeTable)
add_executable(MakeTable MakeTable.cpp)
1.输出 Table 文件
2.将 Table 文件作为参数传入 MakeTable 项目中,并运行它
3.Table 的生成是依赖于 MakeTable 这个 project 的
CMAKE_CURRENT_BINARY_DIR 表示某个 cmake 文件build之后的文件夹,比如这里就是指 build/mylib
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h
COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h
DEPENDS MakeTable)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
将生成的表一起编译到 MathFunctions_Table 中去
add_library(MathFunctions_Table mysqrt.cpp ${CMAKE_CURRENT_BINARY_DIR}/Table.h)
//
// Created by 何时夕 on 2018/10/20.
//
#include <stdio.h>
#include <stdlib.h>
#include “math.h”
int main (int argc, char *argv[]) {
double result;
if (argc < 2) {
return 1;
}
FILE *fout = fopen(argv[1], “w”);
if (!fout) {
return 1;
}
fprintf(fout, “double sqrtTable[] = {\n”);
for (int j = 0; j < 10; ++j) {
result = sqrt(static_cast(j));
fprintf(fout, “%g,\n”, result);
}
fprintf(fout, “0};\n”);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
[外链图片转存中…(img-SseB9rYJ-1710933508504)]
[外链图片转存中…(img-Etg7B7iq-1710933508505)]
[外链图片转存中…(img-lm4l4BKa-1710933508506)]
[外链图片转存中…(img-EBhulzka-1710933508506)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-nGdiBDIi-1710933508507)]