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
⑵ arm-linux-gcc怎么编译自己写的头文件
linux gcc编译c文件头文件
linux gcc编译c文件头文件,使用GCC编译器编译C语言
凶猪下山
转载
关注
0点赞·1047人阅读
GCC编译C源代码有四个步骤:预处理—->编译—->汇编—->链接。
可以利用GCC的参数来控制执行的过程,这样就可以更深入的了解编译C程序的过程。
下面将通过对一个程序的编译来演示整个过程。
#include
int main()
{
printf("happy new year!\n");
return 0;
}
1:预处理:编译器将C程序的头文件编译进来,还有宏的替换,可以用gcc的参数-E来参看。
预处理 命令:gcc -E hello.c -o hello.i
作用:将hello.c预处理输出hello.i
2:编译:这个阶段编译器主要做词法分析、语法分析、语义分析等,在检查无错误后后,把代码翻译成汇编语言。可用gcc的参数-S来参看。
编译器(ccl)将文本文件hello.i 翻译成文本文件hello.s, 它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式描述了一条低级机器语言指令。
编译命令:gcc -S hello.i -o hello.s
作用:将预处理输出文件hello.i汇编成hello.s文件
3:汇编:把编译阶段生成的.s 文件转换为二进制目标代码。可用gcc的参数-c来参看。汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成可重定位目标程序的格式, 并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件,它的字节编码是机器语言。
汇编 命令:gcc -c hello.s -o hello.o
作用:作用:将汇编输出文件hello.s编译输出hello.o文件
4:链接:把obj文件链接为可执行的文件:链接器(ld)负责.o文件的并入。结果就是hello文件,它是一个课执行的目标文件,可以加载到存储器后由系统调用。
链接命令:gcc hello.o -o hello
一步操作的话是: (-o必须在hello之前 )
$gcc hello.c -o hello
$./hello或者:(会默认生成a.out文件)
$gcc hello.c
$./a.out
⑶ linux如何编译oracle存储过程
在笔者的一个银行项目中,我接到编写Oracle存储过程的任务,我是程序员,脑袋里只有一些如何使用CALLABLE接口调用存储过程的经验,一时不知如何下手,我查阅了一些资料,通过实践发现编写ORACLE存储过程是非常不容易的工作,即使上路以后,调试和验证非常麻烦。简单地讲,Oracle存储过程就是存储在Oracle数据库中的一个程序。
一.概述
Oracle存储过程开发的要点是:
◆使用Notepad文本编辑器,用OraclePL/SQL编程语言写一个存储过程;
◆在Oracle数据库中创建一个存储过程;
◆在Oracle数据库中使用SQL*Plus工具运行存储过程;
◆在Oracle数据库中修改存储过程;
◆通过编译错误调试存储过程;
◆删除存储过程;
二.环境配置
包括以下内容:
◆一个文本编辑器Notepad;
◆OracleSQL*Plus工具,提交OracleSQL和PL/SQL语句到Oracledatabase。
◆Oracle10gexpress数据库,它是免费使用的版本;
需要的技巧:
◆SQL基础知识,包括插入、修改、删除等
◆使用Oracle'sSQL*Plus工具的基本技巧;
◆使用Oracle'sPL/SQL编程语言的基本技巧;
三.写一个存储过程
存储过程使用Oracle'sPL/SQL程序语言编写,让我们写一个什么工作都不做的存储过程,我们可以编译和运行它而不用担心会对数据库产生任何损害。
在Notepad,写下:IS
BEGIN
NULL;
END;
把文件存为skeleton.sql.
让我们一行行遍历这个存储过程:
1
2IS
3BEGIN
4NULL;
5END;
行1:
CREATEORREPLACEPROCEDURE是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程,如果存在就覆盖它;
行2:
IS关键词表明后面将跟随一个PL/SQL体。
行3:
BEGIN关键词表明PL/SQL体的开始。
行4:
NULLPL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;
行5:
END关键词表明PL/SQL体的结束
四.创建一个存储过程
SQL语句CREATEORREPLACEPROCEDURE在Oracle数据库中创建、编译和保存一个存储过程。
从Window打开SQL*Plus并且从SQL*Plus登录到你的数据库;打开skeleton.sql文件.
在SQL>命令提示符下输入以下命令:
SQL>@skeleton
SQL>/
SQL*Plus装载skeleton.sql文件的内容到SQL*Plus缓冲区并且执行SQL*Plus语句;SQL*Plus会通知你存储过程已经被成功地创建。
现在你的存储过程被创建,编译和保存在你的Oracle数据库,我们可以运行它。
五.运行一个存储过程
从SQL*Plus命令行提示符运行你的存储过程使用EXECUTE命令,如下:
SQL>EXECUTEskeleton;
SQL*Plus输出一下信息确信存储过程成功执行:PL/.
你也可以在一个无名PL/SQL块内运行你的存储过程,在SQL*Plus命令提示符下,它看起来像:
SQL>BEGIN
2SKELETON;
3END;
4/
现在我们已经运行了我们的存储过程,我们如何修改它呢?
六.修改一个存储过程
让我们写一个输出字符串“HelloWorld!”的存储过程,用Notepad打开你的skeleton.sql文件,.用DBMS_OUTPUT.PUT_LINE过程调用去替换NULL语句,如下所示:IS
BEGIN
DBMS_OUTPUT.PUT_LINE('HelloWorld!');
END;
保存到文件skeleton.sql.
从SQL*Plus命令行,打开文件skeleton.sql.
SQL>@skeleton
SQL>
1
2IS
3BEGIN
4DBMS_OUTPUT.PUT_LINE('HelloWorld!');
5*END;
SQL>/
SQL*Plus通知你存储过程成功创建并输出提示信息:Procerecreated.
SQL>
用EXECUTE命令运行你的存储过程:
SQL>EXECUTEskeleton;
SQL*Plus显示存储过程运行成功:PL/.
我们想要的输出字符串"HelloWorld!"没有出来,在显示一个DBMS_OUTPUT.PUT_LINE结果前需要运行一个SET命令,在SQL*Plus命令行提示符,键入:
SQL>SETSERVEROUTPUTON
再次执行你的存储过程:
SQL>EXECUTEskeleton;
现在结果输出了:HelloWorld!
PL/.
七.调试一个存储过程
当调试一个存储过程时,遵循一样的步骤,修改SQL文件,创建存储过程,执行存储过程,根据编译器反馈的出错信息进行修改,这一步是非常繁琐的,需要依靠经验。
在实际的商用存储过程的开发调试过程中,由于涉及很多表、类型、光标、循环、条件等复杂的逻辑,和PL/SQL语句的灵活运用,编译时会产生很多错误提示信息,程序员在根据这些错误信息定位,进行修正,再编译最后得到正确的结构;
八.放弃一个存储过程
如果在数据库中你不在需要一个存储过程你可以删除它,SQL语句DROPPROCEDURE完成从数据库中删除一个存储过程,DROPPROCEDURE在SQL中被归类为数据定义语言(DDL)类操作,其他的例子有CREATE,ALTER,RENAME和TRUNCATE。.
在SQL*Plus命令提示符下,使用DROPPROCEDURESQL语句删除你的叫做skeleton的存储过程:
SQL>DROPPROCEDUREskeleton;
SQL*:
Proceredropped.
总结
本文详细讨论了如何使用Oracle工具开发Oracle商用存储过程的步骤。最后在存储过程的使用中可能是程序直接调用,也可能被触发器调用
⑷ linux下将程序中用到的第三方库编译到自己的程序中
举例,头文件名 abc.h 函数名为 abc_test(); 第三方库头文件目录为/abc/include/ 链接库目录为/abc/lib/ 1、头文件和源文件:这是最好的情况,引用头文件和相关函数即可。 如:#include "abc.h" abc_test();//直接调用即可 编译时,Makefile中加入编译选项 -I/abc/include 为了能将库的头文件引进来。 而且你的程序运行时,不再需要这个第三方库。 2、静态链接库:引用头文件和相关函数,设提供的静态库名为 libabc.lib 编译时,Makefile中加入 编译选项 1)-I/abc/include #编译时加,为了能将库的头文件引进来; 2)-L/abc/lib -labc #链接时加的 而且你的程序运行时,不再需要这个第三方库。 3、动态链接库,设动态链接库为libabc.so 调用动态链接库文件,需要dlopen等函数 编译时,Makefile中加入 编译选项 1)-I/abc/include #编译时加,为了能将库的头文件引进来; 2)-L/abc/lib -labc #链接时加的 注意:你的程序运行时,需要这个第三方库的libabc.so文件。
⑸ linux环境下编译so库和编译可执行文件
gcc -fPIC -shared caculate.c -o libcaculate.so
-fPIC 压制警告
-shared 动态库
-o 生成目标的文件名
caculate.c
gcc -rdynamic -o main main.c
-rdynamic 生成可执行文件
-o 目标文件名
main是linux环境下的一个可执行文件。
main.c
gcc -c main.c -o main.o
gcc -c minus.c -o minus.o
gcc -c mulit.c -o mulit.o
gcc -c plus.c -o plus.o
gcc main.o minus.o mulit.o plus.o -o myapp
⑹ linux下如何手动编译安装bzip2库
下载bzip2 下载地址:http://www.bzip.org/downloads.html
1>格式是*.tar.gz 解压文件
tar -zxf bzip2-1.0.6.tar.gz 得到一个bzip2-1.0.6目录
2>进入bzip2-1.0.6目录
cd bzip2-1.0.6 //目录视文件存放路径而定
3>make -f Makefile-libbz2_so //-f 标志是使bzip2 根据另一个Makefile来编译,就是Makefile-libbz2_so文件,创建一个动态的libbz.so库文件,然后把bzip2工具连接到这个库上
注:装python的时候如果没有这一步,python安装不上bz2模块
4>make && make install 此命令执行成功,就安装完了
注:如果要重新安装bzip2,要先执行:rm -vf /usr/bin/bz* 命令,不然make install 命令会失败