求C中自定义函数做成LIB后使用方法
以下为网上查找到在C中把自定义函数加入库的方法:
有时我们不希望用户看到自己的源程序文件。那么可以通过如下步骤建立:
1.首先建立包含要放到库中的函数的C源程序,同样,源程序中不要定义main函数,而只包含其它若干个函数的定义。例如:建立FUNC.C,内容如下:
max(int x,int y)
{
return(x> y?x:y);
}
……
2.编译源程序。注意,只进行编译,不要连接。(选择“Compile”菜单中的“Compile to OBJ”选项)若源程序有错误,经修改之后再编译,直到最后通过为止。这时系统就在指定的目录中建立了与源文件相对应的目标文件:FUNC.OBJ。
3.建立自己的目标模块库。
退到DOSSHELL(DOS环境下,选择“File”菜单中的“OS Shell”)在turboc2\目录下执行:
TLIB MYLIB.LIB +FUNC.OBJ。就生成了一个自己的函数库MYLIB,在这个函数库里就包含了函数模块 max(int x,int y)、 min(int x,int y)的二进制代码。现在已经将自定义的函数放进了函数库,就可以把原文件FUNC.C删掉不要了。(当然,为了以后维护方便,还是作一个备份为好)。 拷贝这个库文件到C:\TC\LIB目录中。“+ "是把指定的文件加到指定的库中。还可以用“- "符号,从库中删除指定的模块。以后如用户又编写了新的函数,通过编译之后同样可利用上述方法将其加到用户目标模块库ABC.LIB之中,命令为:
TILB MYLIB.LIB +A.OBJ +B.OBJ +C.OBJ
(2)建立头文件 ,在头文件中声明自己的函数。如新建一个文件myfunc.h如下:
#pragma comment(lib, "mylib.lib ")
int max(int a,int b);
int min(int a,int b);
将头文件放入turboc2下的include文件夹。#pragma预编译命令是将自己的函数库引入头文件,必须要有。mylib的路径要正确。如mylib.lib不在当前目录和系统目录下,要使用完整路径,如: "c:\zhang\mylib.lib "
然后直接在源文件里使用#include :
/* 比较大小。文件名 bijiao.c */
#include "myfunc.h "
void main()
{
int a,b;
printf( "\ninput two numbers: ");
scanf( "%d%d ",&a,&b);
printf( "\nThe lagerer number is:%d ",max(a,b));
printf( "\nThe smaller number is:%d ",min(a,b));
}
然后 下是我想将一个已写好的程序中的一个函数抽离出来,即想将自定义函数放入自定义库中的步骤
基本上模仿着上面来做的
1.先写Mylib.c:
int Q;
char *p;
//因为result 中会用到这两个变量
typedef struct propos
{
char x;
int r;
}Prop;
int result(Prop *pro,int n)
{
.... //此为函数实现(可以确定是正确的!)略..
}
2.然后在TC中把mylib.c转成mylib.lib 成功通过
放入Tc\LIB中
3.自己写头文件mylib.H 放入
#pragma comment(lib, "mylib.lib ") //#pragma预编译命令是将自己的函数库引入头文件
int Q;
char *p;
typedef struct propos
{
char x;
int r;
}Prop;
int result(Prop *pro,int n);
4.重写 main函数 //lib.c
#include <Mylib.h>
extern int Q; // 不知还需不需要声明???
extern char *p; // The Same
....
main()
{
...
尝试调用result函数
}
ctrl+f9后提示:
LIB.OBJ : error LNK2001: unresolved external symbol _result
Debug/LIB.exe : fatal error LNK1120: 1 unresolved externals
注:以上的一切函数,即变量均由写好了的程序分离出来,即保证了函数与两个全局变量的独立性和正确性,所以不会出函数或者全局变量与Main函数中定义的东西相冲突的情况!!
望高手赐教~~~ 能给出在C中 把自定义函数 转换成LIB库的 通用方法更好,望顺带附上与头文件的结合用法~~!!!
在线等 ~~~3Q ~~~~
[解决办法]
error LNK2001: unresolved external symbol _result
凡是这个link2001的问题,要自己先去看看是不是自己有定义或申明但是没有实现, 或者忘记加入外部的库文件了
这些库文件可能是 dll lib obj
设置好对应的目录和要加入的库文件即可
[解决办法]
mylib.h中,
#pragma comment(lib, "mylib.lib ") //#pragma预编译命令是将自己的函数库引入头文件
extern int Q;
extern char *p;
typedef struct propos
{
char x;
int r;
}Prop;
extern int result(Prop *pro,int n);
然后在集成环境里设置用到的库,好像是在option下面。。很久不用tc,记不太清了
[解决办法]
不同的编译器方法不一样,但是tc的lib恐怕没什么用?还不如用vc的命令行工具。
另外楼上的好像没看清楼主的问题……
[解决办法]
#pragma comment(lib, "你的lib ")
extern 函数声明;
[解决办法]
刚才找了一个Tc试了一下,似乎是不支持管理多个文件编译的工程。
要实现多个文件编译,就必须用命令行。
tcc yourfile.c yourlib.lib
这样就行了
另外,刚才安装BC试了一下,在BC3.1下面,已经可以支持工程文件,你可以在工程中加入mylib.lib,这样就可以在集成环境中编译,而不会提示找不到符号。