linux静态编译(安卓安装linux软件)

各位老铁们,大家好,今天由我来为大家分享linux静态编译,以及安卓安装linux软件的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

linux 静态库和动态库编译的区别

Linux库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so libhello.a

为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。

ln-s libhello.so.1.0 libhello.so.1

ln-s libhello.so.1 libhello.so

动态库和静态库的区别:

当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记‘指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。

两种库的编译产生方法:

第一步要把源代码编绎成目标代码。以下面的代码hello.c为例,生成hello库:

/* hello.c*/

#include

void sayhello()

{

printf("hello,world\n");

}

用gcc编绎该文件,在编绎时可以使用任何全法的编绎参数,例如-g加入调试代码等:

gcc-c hello.c-o hello.o

1.连接成静态库

连接成静态库使用ar命令,其实ar是archive的意思

$ar cqs libhello.a hello.o

2.连接成动态库

生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:

$gcc-shared-Wl,-soname,libhello.so.1-o libhello.so.1.0 hello.o

另外再建立两个符号连接:

$ln-s libhello.so.1.0 libhello.so.1

$ln-s libhello.so.1 libhello.so

这样一个libhello的动态连接库就生成了。最重要的是传gcc-shared参数使其生成是动态库而不是普通执行程序。

-Wl表示后面的参数也就是-soname,libhello.so.1直接传给连接器ld进行处理。实际上,每一个库都有一个soname,当连接器发现它正在查找的程序库中有这样一个名称,连接器便会将soname嵌入连结中的二进制文件内,而不是它正在运行的实际文件名,在程序执行期间,程序会查找拥有 soname名字的文件,%B

在Linux下实现静态编译linux下静态编译

Linux是一种开源的操作系统,其以多用户和多任务的方式极大地方便了使用者的操作。在Linux下,使用者可以实现静态编译,这样可以节省空间进行建立应用程序,例如基于Linux的系统,软件开发等。

首先,用户需要准备所需的系统文件和源代码,这些文件是编译程序需要的基础。首先应下载gcc编译系统文件。GCC是GNU软件中使用最广泛的C/C++编译器,对Intel x86、Alpha、Sparc等处理器支持都很友好。

接下来,就是编译源代码的关键步骤了。在命令行窗口内输入C/ C++的源代码文件的路径,并配合正确的编译参数,然后点击“回车”,即可编译处理源代码成可执行程序或者可链接库。例如:gcc–c.cpp–b static其中.cpp指的是源文件;–b static表示静态编译,这样编译的结果就是出一个静态程序;–o xx.o表明编译的结果以xx.o的形式输出。

在静态编译的过程中,还要处理一些特殊的操作,比如添加函数库或者.h等文件。这些操作可以通过命令行操作完成,输入以下命令:gcc–Y/usr/lib xx.o-b static-o.o其中/usr/lib表示的是函数的路径,编译该文件可以实现常用库的自动链接,xx.o表示的是编译前的文件,.o表示编译后的文件,–b static表示静态编译。

最后,用户可以把编译完成的程序拷贝到需要使用的程序处,并使用chmod命令对程序文件权限进行修改,以确保程序正常运行。总之,用户已经完成了静态编译工作,即可把程序正确安装到指定的程序路径,这样就可以使用这些程序建立Linux系统的应用程序了。

总的来说,在Linux下实现静态编译是容易的,只需要准备好源程序、gcc编译系统文件,按照正确的参数命令编译,就可以实现程序的正确静态编译,实现Linux系统的应用程序。

linux 如何运行编译程序

gcc有多达100多个参数,现介绍常用的几个。如果对其他参数也有兴趣,可以参考:man gcc

预先处理选项

-E:只对文件进行预处理,输出结果到标准输出

-C:告诉预处理器不要丢弃注释.配合`-E‘选项使用.-P:告诉预处理器不要产生`#line'命令.配合`-E'选项使用.

-v:显示正在使用的gcc的版本

常用编译选项

-c:将源程序编译为目标代码但并不做链接的工作,不生成最终的可执行文件,只生成一个与源文件文件名相同的以.o为后缀的目标文件。

-S:将远程序编译为一个后缀为.s的汇编语言文件,不会生成可执行文件

-x:强制编译器用指定的语言编译器来编译某个源文件

gcc-x c++ test.c表示强制用C++编译器来编译c程序

-static:强制连接静态库,运行时不依赖动态库

-share:编译时尽量使用动态库

-o:指定生成的可执行文件名,如果没有该选项,如果生成可执行文件,默认文件名为a.out

编译路径选项

-i:指定特定头文件

gcc–c-i/home/zry/test.h test.c

-I<DIR>:依赖选项,指定头文件路径

Linux下大多数函数将头文件放在/usr/include目录下,如果需要指定其他路径,可以使用该选项

gcc–I/home/zry/include–c test.c添加/home/zry/include到查找路径

-L<DIR>:指定库文件搜素路径,用法同上

-l<库名>:指定特定库文件

gcc–lapp–c test.c

Linux的库文件有一个约定,即以lib开头,-lapp表示连接libapp.so库文件

目标生成选项

-shared:生成动态库

gcc–shared libtest.so-i/home/zry/test.h test.c

生成静态库需要ar命令,后面讲解

-fPIC:生成可用于动态库的位置独立代码。所有的内部寻址均通过全局偏移表完成。

-ansi:支持符合ANSI标准的C程序.

该选项就会关闭GNU C中某些不兼容ANSI C的特性,例如asm, inline和 typeof关键字以及诸如unix和vax这些表明当前系统类型的预定义宏。

__asm__, __extension__, __inline__和__typeof__仍然有效

使用`-ansi'选项的时候,预处理器会预定义一个__STRICT_ANSI__宏.有些头文件关注此宏,以避免声明某些函数,或者避免定义某些宏,这些函数和宏不被ANSI标准调用;这样就不会干扰在其他地方使用这些名字的程序了.

fno-asm:此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作关键字。

-fno-strict-prototype:只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数的个数和类型说明,而不是没有参数.而gcc无论是否使用这个参数,都将对没有带参数的函数,认为没有显式说明的类型

-fthis-is-varialble:就是向传统c++看齐,可以使用this当一般变量使用

-fcond-mismatch:允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型

-funsigned-char:

-fno-signed-char:

-fsigned-char:

-fno-unsigned-char:

这四个参数是对char类型进行设置,将char类型设置unsigned char(前两个参数)或者 signed char(后两个参数)

-imacros file:将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中

-Dmacro:相当于C语言中的#define macro

-Dmacro=defn:相当于C语言中的#define macro=defn

-Umacro:相当于C语言中的#undef macro

-undef:取消对任何非标准宏的定义

-M:生成文件关联的信息。包含目标文件所依赖的所有源代码

-MM:和M一样,但是它将忽略由#include<file>造成的依赖关系。

-MD:-M相同,但是输出将导入到.d的文件里面

-MMD:和-MM相同,但是输出将导入到.d的文件里面

警告选项

fsyntax-only:检查程序中的语法错误,但是不产生输出信息.

-w:禁止所有警告信息.

-Wno-import:禁止所有关于#import的警告信息.

-pedantic:打开完全遵从ANSI C标准所需的全部警告诊断;拒绝接受采用了被禁止的语法扩展的程序.

-Werror:将所有警告转换为错误

Werror选项要求GCC将所有警告当作错误进行处理。

-Wall:显示所有警告信息

阅读剩余
THE END