+ -
当前位置:首页 → 问答吧 → 链接库文件问题

链接库文件问题

时间:2011-12-06

来源:互联网

1、比如源程序中有
#pragma comment(lib,"XXX.lib")  
extern double pow(double,double);
double pow(double x,double y)
{
  return 55;
}

然后XXX库文件中也定义了double pow(double x,double y)这个函数,然后XXX库文件还在我的工程默认库文件路径文件夹下,我本来以为这样链接会报错,但是执行的时候没有报错,可执行文件也可以运行,调用的是源文件中定义的函数,单我看的讲链接的书上说这样会报错重复定义,VC2008不报错,请问大牛这是书上写错了还是IDE不规范?

2、还是上面的例子,如果我的源文件中未定义double pow(double x,double y)函数,但是库文件中有两个目标模块都定义了这个函数,那链接的时候会报错吗?如果不报错用哪个模块 定义的函数?

求指点
 

作者: lijihustsuper   发布时间: 2011-12-06

追加一个问题3、
#include <iostream>
using namespace std;

int cin,cout;
int main()
{
 cin=1;cout=2;
 return 0;
}

运行也不报错,难道cin和cout没有重复定义吗?求指点

作者: lijihustsuper   发布时间: 2011-12-06

你不调用的话是不会出错的.

作者: qq120848369   发布时间: 2011-12-06

最好是以C++标准来,不要那么写为好。VS很多地方都没有执行C++标准,这是众所周知的。

作者: lofeo   发布时间: 2011-12-06

引用 1 楼 lijihustsuper 的回复:追加一个问题3、
#include <iostream>
using namespace std;

int cin,cout;
int main()
{
cin=1;cout=2;
return 0;
}

运行也不报错,难道cin和cout没有重复定义吗?求指点



不报错?

要把int cin,cout;写到main()里面才不报错吧
因为main里的局部符号隐藏了std里的同名符号

作者: yisikaipu   发布时间: 2011-12-06

确实不报错,如果写在里面局部变量覆盖全局变量,这个我知道,我本来也以为写在外面报错,但确实不报错,谁帮我在gcc里试试吧。

引用 4 楼 yisikaipu 的回复:
引用 1 楼 lijihustsuper 的回复:追加一个问题3、
#include <iostream>
using namespace std;

int cin,cout;
int main()
{
cin=1;cout=2;
return 0;
}

运行也不报错,难道cin和cout没有重复定义吗?求指点


不报错?

要把int cin,cout;写到……

作者: lijihustsuper   发布时间: 2011-12-06

我也vs2008,报错!
C/C++ code
error C2872: 'cin' : ambiguous symbol

作者: yisikaipu   发布时间: 2011-12-06

还有一个问题是:

生成可执行文件的时候,如果用到了库文件某个对象模块定义的一个函数,那么会不会把库文件的全部代码加到可执行文件中呢?还是只加一部分?

作者: lijihustsuper   发布时间: 2011-12-06

你是不是在源文件中用了“cin>>x, cout<<y”之类的,我这是加入不用这些重载运算符就不报错

引用 6 楼 yisikaipu 的回复:
我也vs2008,报错!

C/C++ code
error C2872: 'cin' : ambiguous symbol

作者: lijihustsuper   发布时间: 2011-12-06

gcc报错!
error: reference to 'cin' is ambiguous

什么也没加,全部代码:

C/C++ code
#include "stdafx.h"
#include <iostream>
using namespace std;

int cin;
int main()
{
    cin=1;
    return 0;
}

作者: yisikaipu   发布时间: 2011-12-06

引用 7 楼 lijihustsuper 的回复:还有一个问题是:

生成可执行文件的时候,如果用到了库文件某个对象模块定义的一个函数,那么会不会把库文件的全部代码加到可执行文件中呢?还是只加一部分?


只加一部分。静态库只加相关代码,动态库则连代码也不加

作者: yisikaipu   发布时间: 2011-12-06

对了,你这个代码我这运行也报错,不过你把cin=1去掉试试,就不会报错了

引用 9 楼 yisikaipu 的回复:
gcc报错!
error: reference to 'cin' is ambiguous

什么也没加,全部代码:


C/C++ code
#include "stdafx.h"
#include <iostream>
using namespace std;

int cin;
int main()
{
cin=1;
return 0;
}
……

作者: lijihustsuper   发布时间: 2011-12-06

VS应该不会有问题,GCC应该会出现问题,GCC会有全局符号冲突的问题,具体的你可以去百度一下,linux下动态链接的设计和windows是完全不一样的

作者: kingskyleader   发布时间: 2011-12-06