作者stenler (挖哈哈)
看板C_and_CPP
标题[问题] 请问哪里可以学习关於外部连结的问题
时间Sat Feb 21 02:12:20 2009
翻了仿间不少的书 好像很少有书籍是介绍我想知道的(应该是我看得不够细)
这些书上大部分都介绍一些型别语法函式库流程控制结构类别之类的
但我想知道的是一个程式细节上是怎麽被编译而成。
因为我现在处理的专案无法用IDE去compile...更让我对一堆档案间
是怎麽产生obj,lib,以至於後面生出image完全搞不清楚。
举例来说,例如今天要产生一个叫PCH_platform的模组
里面的组成包函了 PCH_platform.c ,这个.c档里面include了一个PCH_platform.h
而我在 PCH_platform.c里面看到一只 PCIread_byte()的function...
可是这只.c档里面明明就没有包含这只function的定义以及宣告,.h档里面也没有宣告
就可以这样直接拿来用,请问到底是甚麽原理呢?虽然我猜可能跟lib有关
可是完全不晓得这只.c档是跟哪只.lib连结的。
同样的情形也发生在定义常数上...明明一个 PCI_REGaddr常数在.c档跟.h档都没有宣告
可是却也可以直接用~实在是完全搞不懂 (整个专案建置的环境是在cmd下nmake)
--------------------------------------------------------------------------
以前使用IDE的时候很方便,就建置个专案,把function放在不同的档案之间要
呼叫只要把xxx.cpp,yyy.cpp都拉进专案,然後别只档案要用再include一个
有宣告xxx.cpp以及yyy.cpp的function之header就好,导致现在要用cmd compile就不知道
怎麽拉function了。
所以我今天又做了一个小实验,我弄了 a.cpp,b.cpp,b.h,内容摘要方别是
a.cpp:
#include "b.h"
void main(){
int i = b(3); //使用别只档案的function
}
b.cpp:
int b(int bb){
return bb+2; //定义
}
b.h:
int b(int bb); //宣告
第一次编译的时候,这三只是在同一个专案中,理所当然地build过了
接下来我把b.cpp从专案中remove,然後build code就不过了
会出现 "无法解析的外部符号 int b()"这种问题....这就是我不懂的地方
原来的想法是: compile分成 1.产生obj 2.link成可执行档
今天我虽然把b.cpp从专案中移除了,可是第一次build code所留下来的b.obj还在
照理说在link的阶段..a.obj应该去找到b.obj里面的int b()然後把她拉进来
形成执行档才对的阿...为什麽编译不会过呢?纠境~~在整个build的过程
IDE做了哪些事情?而在cmd底下我又该怎麽下命令将这三个档案成功build起来?
那是不是说,假如我把b.cpp建成一个.lib档,就...
1.不会有无法解析外部符号的问题 2.a.cpp不必去include b.h就可以用int b()
又假设正确的话...我又该如何把这个b.lib拉进来~让程式在bulid的时候去找到
b.lib呢?
问题实在很长 感谢耐心看完的板友~如果有像这样的问题的话,究竟有甚麽样的资源
可以参考呢? 希望各位前辈们可以替小弟指点迷津 m(_ _)m
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.136.196.245
1F:推 WalkingIce:你用哪个 ide? @.@ 02/21 05:40
2F:→ stenler:Visual C++ 02/21 09:11
3F:→ WPC001:一定有宣告, 你没找到而已, 不见得放在.h 02/21 09:24
4F:→ WPC001:你b.cpp没放在专案里, 他build时为何要去link b.obj? 02/21 09:25
5F:→ WPC001:除非你自行手动在编译选项的连结那边, 手动加入b.obj 02/21 09:25
6F:→ stenler:请问楼上..没放在.h也没放在.c...那有可能放在哪呢? 02/21 10:11
7F:→ stenler:我确定过该.h档没有再include别的.h档..另外如果我把b.cpp 02/21 10:11
8F:→ stenler:做成b.lib的话,那我该怎麽设定或下指令让a.cpp在link的时 02/21 10:12
9F:→ stenler:後找到b.lib然後去做连结呢? 02/21 10:12
10F:→ tsaiminghan:不能在该function上按右键找选单中的寻找定义之类的吗 02/21 10:32
11F:→ stenler:回楼上~就算找到定义 还是不知道main.cpp以及xxx.cpp的 02/21 10:41
12F:→ stenler:function间是怎麽link起来的...因为main包含的标头档以及 02/21 10:42
13F:→ stenler:main.cpp都没有该function的宣告..不过xxx.cpp有被做成一 02/21 10:43
14F:→ stenler:只lib..我猜main的cpp应该是用某种机制跟xxx.lib link起来 02/21 10:43
15F:→ stenler:只是怎麽连的不清楚@@ 02/21 10:43
16F:→ WPC001:没有神奇的不知名机制,一切都是科学化,这才是合理的语言 02/22 00:08
17F:→ WPC001:如果是要在code里头指定lib, 可以用#pragma来指定(VC) 02/22 00:09
18F:→ WPC001:但宣告的部分, 还是得宣告..尤其是C++, 型别检查非常的重要 02/22 00:10