编译方法概述
① 如何在windows上用ndk交叉编译其他平台程序
目标 :编译arm64的.so库
编译方法:理论上应该有两种交叉编译方法,法一,在linux服务器上安装交叉工具链,直接用交叉工具链进行编译链接;法二,使用ndk完成交叉编译,因为
ndk已经安装好交叉编译工具链,以及相关的系统库和系统头文件了。这两种方法的区别在于,linux服务器上的编译使用的makefile和ndk使用的.mk
文件显然不同。原因是ndk作为一个集成编译环境,制定了一套特定的规则用于生成最终的编译脚本。
这里简单总结下,如何在windows用ndk进行交叉编译arm64目标平台的.so库:
step1:找到ndk开发工具包,官网之类的都可以下载,Android-ndk64-r10-windows-x86_64.rar文件
step2:解压上述ndk工具包,将包含程序源文件和头文件的文件夹testProject都放入android-ndk-r10下的samples目录下。
放在其他地方当然也可以,但是后续相对路径之类的不太好加,既然其他例子都放这,把代码放这编译是最保险的了。
step3:在testProject中增加一个jni的文件夹,必须要添加!!!!!!
step4:在jni文件夹中,添加一个Android.mk的文件,必须要添加!!!!!
step5:在jni文件夹中,添加一个Application.mk的文件与Android.mk并列,必须要添加!!!!!
step6:Android.mk和Application.mk合起来就类似于linux环境下的makefile编译文件。
如何写Android.mk,可以参考例子helllo-jni中jni文件夹下的Android.mk。
LOCAL_PATH:=$(call my-dir) #必须要写的
include $(CLEAR_VARS) #必须要写的
LOCAL_MODULE:=hello-jni #编译出来的模块名称
LOCAL_SRC_FILES:=hello-jni.c #制定编译的源文件名称
include $(BUILD_SHARED_LIBRARY)#放在最后
除了上述变量之外,还有其他的指定的变量,
LOCAL_CFLAGS,用于指定编译选项,这个和makefile中是完全一样的,可以指定编译选项-g,也可以指定编译宏及宏值
LOCAL_LDLIBS,用于指定链接的依赖库,这个可以makefile也是完全一样的,可以指定链接库用-l库名,以及指定库搜索路径用_L路径名
LOCAL_STATIC_LIBRARIES,指定链接的静态库名,makefile中没有
LOCAL_C_INCLUDES,用于指定编译头文件的路径,和makefile中不同,路径前不需要加-I,直接写路径即可,可以是相对路径或绝对路径,
多个路径之间用空格隔开。
编写上述Android.mk碰到的问题有,
(1)使用默认的系统自动加载stl库头文件总是出错,只好手动在LOCAL_STATIC_LIBRARIES指定sources/cxx-stl/stlport/stlport来完成对#include<string>这种c++形式的头文件加载
(2)使用$(SYSROOT)/usr/include来完成对系统库头文件的加载,结果找不到sem_t符号,只好指定platforms/android-L/arch-arm64/usr/include
step7:Application.mk编写
APP_STL指定使用的stl移植库,动态或者静态都行
APP_CPPFLAGS,指定app编译的编译选项
APP_ABI指定abi规范类型,例如arm64-v8a,也可以写成ALL就是把所有的类型全部编一编
APP_PLATFORM指定编译的platform名称,这里可以写成android-L或者不指定全编。
step8:编译完成后,运行。
启动cmd,使用cd /D进行到testProject的jni目录下
step9:将android-ndk-r10下的ndk-build.cmd直接拖拽到cmd中,此时直接敲回车,就可以编译了。当然也可以加一个 clean,清除编译中间文件。
step10:检查下编译结果,编译成功后在testProject中多了两个文件夹与jni并列的,libs和obj。
编译链接后的结果就在libs中!
② 计算机常用几种语言编译方法
计算机语言的编译方法主要有三种:解释器、编译器和即时编译器。解释器逐行编译源代码,无需生成可执行文件,运行时效率较低。编译器将整个源代码编译成机器指令,生成可执行文件,运行速度更快。即时编译器结合了解释器和编译器的特性,编译速度中等,运行速度比解释器快,比编译器慢。
计算机常用编译方法
计算机语言的编译方法主要有:
1. 解释器
解释器逐行读取源代码,并将其逐行转换为机器指令。与编译器不同的是,解释器在运行时执行编译过程,因此不需要生成可执行文件。
2. 编译器
编译器将整个源代码翻译成机器指令,并生成可执行文件。可执行文件可以在不使用编译器的情况下直接在计算机上运行。编译器编译代码的速度较慢,但生成的代码运行速度更快。
3. 即时编译器(JIT)
即时编译器结合了解释器和编译器的特性。它先将源代码编译成一种中间格式,称为字节码,然后在运行时将字节码动态编译成机器指令。JIT 编译器比解释器速度更快,但比编译器速度慢。
编译方法的比较
特性解释器编译器即时编译器速度慢快中等效率低高中等内存使用大小中等可移植性高低中等开发速度快慢中等
选择编译方法
选择哪种编译方法取决于具体情况。
如果需要快速开发和快速迭代,则解释器可能是更好的选择。如果需要高性能和效率,则编译器可能是更好的选择。如果需要介于两者之间的折中方案,则即时编译器可能会是更好的选择。
③ Qt三方库开发技术(一):QuaZIP介绍、编译和使用
QuaZIP是一个由Gilles Vollant提供的ZIP/UNZIP软件包的简单C++封装,旨在方便Qt项目访问ZIP档案。以下是关于QuaZIP的介绍、编译和使用方法的详细说明:
一、QuaZIP介绍
- 功能:QuaZIP提供了对ZIP文件的访问功能,包括压缩和解压缩。
- 依赖:它依赖于zlib库,因此在编译和使用QuaZIP时,需要确保zlib库的头文件和库文件可用。
- 平台兼容性:QuaZIP已在多个平台上测试,包括Linux、FreeBSD、HPUX和Windows。
二、编译QuaZIP
安装zlib库:
- 在编译QuaZIP之前,需要确保已经正确安装了zlib库。
- 在Windows上,由于Qt5的特定需求,可能还需要单独安装zlib库。
下载QuaZIP源代码:
- 访问QuaZIP的官方页面,下载所需版本的源代码。
使用CMake配置项目:
- 使用CMake工具进行配置和生成项目。
- 确保正确设置了Qt版本,并添加了zlib库路径。
在Qt Creator中编译项目:
- 使用Qt Creator打开QuaZIP源代码的pro文件。
- 确保在pro文件中正确指定了zlib库的路径。
- 编译项目,生成QuaZIP库文件。
三、使用QuaZIP
包含头文件:
- 在需要使用QuaZIP的Qt项目中,包含必要的QuaZIP头文件。
创建QuaZipManager实例:
- 创建QuaZipManager对象,用于管理ZIP文件的操作。
调用方法操作ZIP文件:
- 使用QuaZipManager提供的方法,如getZipFileList,来获取ZIP文件中的文件列表。
- 示例程序中,通过调用getZipFileList方法,输出了指定ZIP文件中的文件列表。
验证结果:
- 运行示例程序,查看输出结果。
- 如果输出结果显示了从指定ZIP文件中检索到的文件列表,则表明QuaZIP已成功安装并能正常工作。
总结:QuaZIP提供了一个简洁、易于使用的接口,用于在Qt项目中处理ZIP文件。通过遵循上述步骤,可以成功地安装和使用QuaZIP库,实现对ZIP文件的压缩和解压缩功能。
④ “编译方式”和“解释方式”的区别
程序员编写的程序现在一般都是用高级语言编写的,如c/c++ 以及面向对象的visual 系列;这样编写的程序计算机是不能直接执行的,因为计算机只能执行二进制程序。因此要经过一个源程序代码翻译成二进制的过程。计算机并不能直接地接受和执行用高级语言编写的源程序,源程序在输入计算机时,通过“翻译程序”翻译成机器语言形式的目标程序,计算机才能识别和执行。这种“翻译”通常有两种方式,即编译方式和解释方式。
两者的区别如下:
解释方式:程序运行时,取一条指令,将其转化为机器指令,再执行这条机器指令。这种方式每次运行程序时都要重新翻译整个程序,效率较低,执行速度慢,如QB,不过现在很少再用这种低效的方式的设计语言了。
编译方式:程序运行时之前,将程序的所有代码编译为机器代码,再运行这个程序。然后每次执行的时候就可以直接执行这个翻译好的二进制文件了,这样的程序只需要翻译一次,效率明显要高很多,现在的大多数语言都是这种方式,网页中的asp.net 采用的也是这种方式。
简单的说,编译就是全文翻译,全部翻译完才执行。解释就相当于同声翻译,边翻译边执行。