.lib文件怎么造的?想知道具体方法

SnowFoxMM 2004-05-04 01:04:45
比如我有三个文件
a.h //里面是函数声名

b.c// a.h里面的函数的定义与实现

test.c // 这个文件用到b.c里面的函数

我想把函数定义的文件做成类似我们平时用的标准函数那样,只

需加头文件就可以调用,但用户看不到源程序。是不是要把b.c做成lib?或是什么?

怎么造请给出具体方法
...全文
82 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
julyclyde 2004-05-07
  • 打赏
  • 举报
回复
那也许吧
反正gcc编的和borland是不通用的
junnyfeng 2004-05-06
  • 打赏
  • 举报
回复

我指的"但有些是兼容的,具体可能要试试才知道" 是指非VC,TC的其他编译器
julyclyde 2004-05-06
  • 打赏
  • 举报
回复
2 肯定说c和tc的lib没有一个兼容的
junnyfeng 2004-05-06
  • 打赏
  • 举报
回复
1。 先把两个c文件编译成obj,然后链接这两个obj应该可以解决
gcc -c b.c -o b.o
gcc -c test.c -o test.o
gcc test.o b.o -o test

2 . 肯定说VC与TC的lib是不兼容的,但有些是兼容的,具体可能要试试才知道

3. gcc 的话可以指定库搜索路径:gcc -Ldir_lib (L后面是lib的路径)

SnowFoxMM 2004-05-06
  • 打赏
  • 举报
回复

上面还有几点问题,up
gernal_dn 2004-05-05
  • 打赏
  • 举报
回复
lib是obj的打包,用lib指令即可。
freefalcon 2004-05-05
  • 打赏
  • 举报
回复
不存在厉害不厉害,这些知识点你知道了也就会了

extern "C"是当C++里面要用到c函数时需要的
主要是因为C++和C对函数名的修饰不一样
你可以试一下,用VC新建一个console程序,默认的main函数所在的文件扩展名将是.cpp
然后添加一个头文件,在头文件里声明一个函数,然后再添加一个.c文件,在.c文件里面实现这个函数
最后在[main].cpp中包含头文件,并调用那个函数,你会发现链接是通不过的

以函数int add(int a, int b);为例,采用C++方式编译后,内部所用函数名为?add@@YAHHH@Z而采用C方式为_add,二者的名字是不一样的,而默认使用的是C++方式
关键字exterc "C"便是指明函数是C函数

具体可以看看msdn上的extern "C"
SnowFoxMM 2004-05-05
  • 打赏
  • 举报
回复
既然问到这里了,干脆多问几个,请大家继续帮忙,结贴时我会加分的

gcc(命令行的)怎么编译多个文件?如上面所说的。

逐个编译是不行的。于是产生了三个问题:

1。如果test.c中只#include b.c,而b.c中只#include a.h,这样虽然可以

编译,但看起来好像不太规范吧。这样就要一起编译两个c文件了,

这两个文件都#include a.h。用命令行怎么操作?

2. 一种编译器编译出来的lib是否只适合与该编译器用,而其他编译器不能调用?
如果不是,互调用时要注意什么?

3。 gcc命令行调用指定的lib时,是否只能在所编译的文件中添加 #pragma comment(lib, "XXX") //XXX为你的lib库名。 就这一种方法吗?你还有其他方法?
SnowFoxMM 2004-05-05
  • 打赏
  • 举报
回复
心宇真厉害,方法全对的

不过你说的
----------------
#ifdef __cplusplus
extern "C" {
#endif

//..这里是a.h中原来的函数声明部分

#ifdef __cplusplus
}
#endif
---------------

这段不明白,能否解析一下?
plbhm 2004-05-05
  • 打赏
  • 举报
回复
b.c中 #include "a.h" 以及所需的头文件,在“Header File"目录里以添加了所需头文件
然后编译成lib,并放进VC的lib目录里。
然后新打开test.c(里面就#include "a.h",另外需要把lib文件加入工程(test)),然后使用extern "C" WINAPI functionname(para1,para2,..)
就可以正常使用了,试试就知道了.
chenqing1128 2004-05-05
  • 打赏
  • 举报
回复
kaphoon(齐柏林飞艇) :我的态度怎么啦?
freefalcon 2004-05-05
  • 打赏
  • 举报
回复
等等

先别按上面的做,当然做了也不错
关键是你还没有导入lib库呢

方法有三:
其一:
在test.c中使用
#pragma comment(lib, "XXX") //XXX为你的lib库名

其二:
在project>setting>link>general>object/library modules中添加你的库名,用空格与前面隔开

其三:
用project>add to project...>files将你的库加入工程

另外,建议不要将你的库放到vc的lib中,你可以新建一个目录嘛,比如mylib等,如果是后者你要注意路径设置
freefalcon 2004-05-05
  • 打赏
  • 举报
回复
先尝试如下方法,不行再论

修改a.h
添加
#ifdef __cplusplus
extern "C" {
#endif

//..这里是a.h中原来的函数声明部分

#ifdef __cplusplus
}
#endif

原因:c和c++对函数名的修饰不一样,vc默认中默认是C++修饰方式
SnowFoxMM 2004-05-05
  • 打赏
  • 举报
回复
就是问lib指令怎么用?
SnowFoxMM 2004-05-04
  • 打赏
  • 举报
回复
楼上的啥意思?具体操作怎么样?
vsfan 2004-05-04
  • 打赏
  • 举报
回复
编译后对目标文件用lib命令
SnowFoxMM 2004-05-04
  • 打赏
  • 举报
回复

我试了一下
选Static Library那项,创建工程……

b.c中 #include "a.h" 以及所需的头文件,在“Header File"目录里以添加了所需头文件
然后编译成lib,并放进VC的lib目录里。

然后新打开test.c(里面就#include "a.h",没添加b.c),在链接时出现不能识别b.c中
所定义的函数名字。 何解?
kaphoon 2004-05-04
  • 打赏
  • 举报
回复
chenqing1128(cq)
这种态度不好~~~哈哈
chenqing1128 2004-05-04
  • 打赏
  • 举报
回复
补充:当然要把a.h 和a.c 要和test.c要放在一个目录下
chenqing1128 2004-05-04
  • 打赏
  • 举报
回复
只要这样就可以了,把b.c改名为a.c,在a.c里加上#include "a.h"就可以了
使用的时候只要在test.c里用#include "a.h"就可以了
没有必要用lib
但要注意函数声明,和函数定义的文件名字要一致如a.h 和a.c
你的a.h和b.c是不可以的。
加载更多回复(2)

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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