WEB开发网
开发学院软件开发VC 解决出现的LNK2005“符号已定义”错误 阅读

解决出现的LNK2005“符号已定义”错误

 2007-03-25 21:32:58 来源:WEB开发网   
核心提示: 建一个源文件,就叫mylib.c,解决出现的LNK2005“符号已定义”错误(5),内容如下:/* mylib.c */#includevoid foo(){printf("%s","I am from mylib!");}用cl /c /MLd m

建一个源文件,就叫mylib.c,内容如下:

/* mylib.c */
#include
  void foo()
{
 
printf("%s","I am from mylib!
");
}

cl /c /MLd mylib.c

命令编译,注意/MLd选项是指定libcd.lib为默认标准库。lib.exe是VC自带的用于将目标文件打包成程序库的命令,所以我们可以用

lib /OUT:my.lib mylib.obj

将mylib.obj打包成库,输出的库文件名是my.lib。接下来把main.c改成:

/* main.c */
void foo();
  int main()
{
 
foo();
 
return 0;
}

cl /c main.c

编译,然后用

link main.obj my.lib

进行链接。这个命令能够成功地生成main.exe而不会产生LNK2005和LNK1169链接错误,你仅仅是得到了一条警告信息:"warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs; use /NODEFAULTLIB:library"。我们根据前文所述的扫描规则来分析一下链接器此时做了些啥。

一开始E、U、D都是空集,链接器首先扫描到main.obj,把它加入E集合,同时把未解析的foo加入U,把main加入D,而且因为main.obj的默认标准库是libc.lib,所以它被加入到当前输入文件列表的末尾。接着扫描my.lib,因为这是个库,所以会拿当前U中的所有符号(当然现在就一个foo)与my.lib中的所有目标模块(当然也只有一个mylib.obj)依次匹配,看是否有模块定义了U中的符号。结果mylib.obj确实定义了foo,于是它被加入到E,foo从U转移到D,mylib.obj引用的printf加入到U,同样地,mylib.obj指定的默认标准库是libcd.lib,它也被加到当前输入文件列表的末尾(在libc.lib的后面)。不断地在my.lib库的各模块上进行迭代以匹配U中的符号,直到U、D都不再变化。很明显,现在就已经到达了这么一个不动点,所以接着扫描下一个输入文件,就是libc.lib。

上一页  1 2 3 4 5 6  下一页

Tags:解决 出现 LNK

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接