怎么样制作一个库文件?

iamliadai 2006-11-13 10:01:14
想制作一个相当简单的库文件,就是练习一下。有下列迷惑。。。高人给解答一下啊
=====================================
环境 : GCC
------
假设:
文件:
1、 main.c( 在这个文件中调用max.c中的max函数,包含 max.h文件)
2、max.c文件定义max函数
3、max.h头文件声明max函数
-----------------------
意图:
想编译max.c文件,然后生成目标文件max.o 然后做库函数被调用
-----------------------------
问题:
1、怎么把max.o文件做成 lib文件?是简单的改后缀名成 .a 或者 .so 吗?(我估计不是)还是有什么工具?
2.静态链接与动态链接文件都怎么制作呢?
3.怎么设置一下 编译器 ,可以让编译器找到这个文件?如果上面的例子中我把生成的库函数放到某个目录下面(不是默认的)在链接的时候怎么找到呢?
4.那些标准的库函数是不是都被编译到 libc.a里面了?就是说调用某个标准库函数的时候就到这个文件里面去链接?
5.Linux 下面的 /usr/include/lib/ 下面的东西与 /lib/ 下面的东西有什么不同?
6.可以更改compiler的默认的库的搜索目录吗?
...全文
585 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2006-11-14
  • 打赏
  • 举报
回复
自定义函数库的方法及应用:

一、2个相关的命令

1、TCC——TC的DOS下的命令行编译连接工具
2、TLIB——TC的DOS下的库操作工具



二、1个自定义的函数库的例子

1、 在TC集成环境下,编一个文件USERADD.C
#define _NO_MAIN
int add(int *a,int *b)
{ int c;
c=(*a)+(*b);
return c;
}
按ALT—F9编译 生成一个 USERADD.OBJ文件。

2、按F10—F—O 退到DOSSHELL(DOS环境下)
COPY USERADD.OBJ 到 ..\LIB目录,在\LIB目录下执行
TLIB USERLIB.LIB+USERADD.OBJ 就生成了一个自己的函数库 USERLIB,在这个函数库里就包含了函数模块 int add(int *a,int *b) 的二进制代码。现在已经将自定义的函数放进了函数库,就可以把原文件USERADD.C删掉不要了。(当然,为了以后维护方便,还是作一个备份为好)。 以后如有其它的函数模块,也可以编译后用TLIB 命令加入到这个函数库里。

3、写一个包含文件 USER1.H,写完后COPY到INCLUDE 目录。内容如下:
int add(int *,int *);

4、作好了以上的自定义函数库的准备工作,现在就可以使用了。
写一个程序,取名为ADD-1.C,在程序中调用库函数add( );
#include<stdio.h>
#include<user1.h>
void main( )
{
int a,b,c;
a=20;b=30;
c=add(&a,&b);
printf(“%d”,c);
}

5、在DOS命令行下,执行 TCC ADD-1.C ..\LIB\USERLIB.LIB 就OK!
运行ADD-1.EXE,可以看到输出结果 50
=============================================================

注:在DOS下编译和连接是一件烦心的事情,下面讲的方法就可以在TC集成环境下实现编译和连接。
在上面的第二步中,TLIB命令的执行改为 TLIB CS. LIB+USERADD.OBJ 这里是将自定义函数模块的二进制代码加入到 运行时库CS. LIB里面。(对应不同的编译模式,选用不同的Cx.LIB)
然后在集成环境下编译连接 ADD-1.C 就可以了。

附注:CS.LIB 小模式库
CC.LIB 紧凑模式库
CM .LIB 中模式库
CL .LIB 大模式库
CH .LIB 巨模式库
(以上五种为运行时库,无论建立何种程序都要连接这些函数库)

EMU|FP87:EMU 是浮点数模拟函数库,而FP87则是当我们具有80X87共处理机时所使用的浮点数函数库。如果程序中有浮点运算就必须连接这二个函数库之一,以及MATHx函数库。
MATHx:数学函数库。其中x代表s、c、m、l、h字符。

另外,TC 的哪一个库函数的二进制代码放在哪一个函数库里不得而知。但有一点可以肯定,就在这其中的库里面。
alan001 2006-11-14
  • 打赏
  • 举报
回复
1)TC2.0,建立一个有独立代码段名的*.OBJ

2)使用TC工具TLIB.EXE,创建XX.LIB或加入现有库内...............

3)恭喜
飞哥 2006-11-14
  • 打赏
  • 举报
回复
用gcc的-c选项生成.o文件,如
gcc -c test1.c test2.c test3.c
编译后会生成test1.o test2.o test3.o三个目标文件。
2、然后用ar命令生成.a文件,如
ar crv test.a test1.o test2.o test3.o
hailongchang 2006-11-14
  • 打赏
  • 举报
回复
在VC中建立一个static lib的工程
iamliadai 2006-11-13
  • 打赏
  • 举报
回复
高人们快来顶顶啊
iamliadai 2006-11-13
  • 打赏
  • 举报
回复
谢谢楼上,静态库怎么制作啊
laiwusheng 2006-11-13
  • 打赏
  • 举报
回复
通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。

so_test.h:

#include
#include
void test_a();
void test_b();
void test_c();

test_a.c:
#include "so_test.h"
void test_a()
{
printf("this is in test_a...\n");
}

test_b.c:
#include "so_test.h"
void test_b()
{
printf("this is in test_b...\n");
}

test_a.c:
#include "so_test.h"
void test_c()
{
printf("this is in test_c...\n");
}
将这几个文件编译成一个动态库:libtest.so
$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so

2、动态库的链接
在1、中,我们已经成功生成了一个自己的动态链接库libtest.so,下面我们通过一个程序来调用这个库里的函数。程序的源文件为:test.c。
test.c:
#include "so_test.h"
int main()
{
test_a();
test_b();
test_c();
return 0;
}
l 将test.c与动态库libtest.so链接生成执行文件test:
$ gcc test.c -L. -ltest -o test
l 测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
$ ldd test
l 执行test,可以看到它是如何调用动态库中的函数的。
3、编译参数解析
最主要的是GCC命令行的一个选项:
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件

l -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

l -L.:表示要连接的库在当前目录中

l -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称

l LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。

l 当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。
4、注意

调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,这时你要作的就是通过修改LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧