| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 807 人关注过本帖
标题:初学者---文件包含可以完全运行,工程文件只可以编译,却链接出错,怎么回事 ...
只看楼主 加入收藏
cquwt
Rank: 1
等 级:新手上路
帖 子:41
专家分:2
注 册:2013-12-24
结帖率:69.23%
收藏
已结贴  问题点数:5 回复次数:8 
初学者---文件包含可以完全运行,工程文件只可以编译,却链接出错,怎么回事?完全莫不清楚状况。
程序代码:
编程实现功能:求2个数的最大公约数和最小公倍数。要求用函数实现,并且将主函数和这两个函数分别存入3个文件a.cpp,b.cpp,c.cpp中,并且将b.cpp和c.cpp两个文件中函数的声明编写一个名为bc.h的头文件,在主函数中将bc.h包含进来,然后分别用文件包含和工程文件两种方法实现多文件的编译链接。         
我第一种方法(文件包含)可以运行出来,可是第二种方法(工程文件)可以编译,不可以连接是怎么回事?
总显示这个:
Linking...
b.obj : error LNK2005: "long __cdecl b(long,long)" (?b@@YAJJJ@Z) already defined in a.obj
c.obj : error LNK2005: "long __cdecl b(long,long)" (?b@@YAJJJ@Z) already defined in a.obj
c.obj : error LNK2005: "long __cdecl c(long,long)" (?c@@YAJJJ@Z) already defined in a.obj
  abjhhh.exe : fatal error LNK1169: one or more multiply defined symbols found
    【a.cpp】
#include <stdio.h>
#include "b.cpp"
#include "c.cpp"
#include "bc.h"
void main()
{

 long a,h,m;

 printf("please input a,h:  ");

 scanf("%d,%d",&a,&h);
  if(a<h)
  { 
         m=a;a=h;h=m;    //a是较大值,h是较小值
  }
  printf("\n***********************************\n");
  printf("\n%d和%d的最大公约数是%d\n",a,h,b(a,h));
  printf("%d和%d的最小公倍数是%d\n",a,h,c(a,h));
}

    【b.cpp】
long b(long x,long y)
{
   long k,n,r;
   k=x;  n=y;     //k是较大值,n是较小值
   while(n!=0)
   {
       r=k%n;
       k=n;
       n=r;
   }
   return k;
}

    【c.cpp】
long c(long x,long y)
{
  long k,n,l;
  k=x; n=y;
  l=k*n/b(k,n);
  return l;
}
    【bc.h】
long b(long x,long y);
long c(long x,long y);
搜索更多相关主题的帖子: 最小公倍数 公约数 工程 
2014-05-09 23:47
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 楼主 cquwt
重复定义
long b(longx,longy)和
long c(longx,longy)已经在bc.h里声明了,a.cpp就不要再包含b.cpp和c.cpp了

总有那身价贱的人给作业贴回复完整的代码
2014-05-10 00:20
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
#include "b.cpp"
#include "c.cpp"
#include "bc.h"
前二行与第三行冲突,只能取其一。一般是不推荐直接 include 程序源文件的。
2014-05-10 01:08
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
收藏
得分:0 
如果是将b.cpp和c.cpp导入工程的话,必须在a.cpp文件中去掉相应的两个包含命令,否则就重复定义了。

【a.cpp】
#include <stdio.h>
#include "bc.h"
void main()
。。。
2014-05-10 07:42
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
收藏
得分:5 
回复 3 楼 top398
这三行包含命令并不冲突。函数声明是可以重复多次的。关键是如果楼主把b.cpp和c.cpp已经导入了工程,再用包含命令把它们包含进工程,工程中的函数定义就重复了。
2014-05-10 08:09
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
收藏
得分:0 
回复 3 楼 top398
你试一试,去掉两个包含cpp的命令,前面放3个#include "fbc.h"都一点问题没有。在一个工程中:每个函数的定义只能一次,而函数声明可以有多次。
2014-05-10 08:15
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
收藏
得分:0 
如果不把b.cpp和c.cpp导入工程,楼主的三个包含命令就可以并存。

[ 本帖最后由 kwxx 于 2014-5-10 08:23 编辑 ]
2014-05-10 08:18
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
好吧,因为我确实不会 include 源文件,多文件联合编译时都是分别命令行编译再一次链接,所以这个细节没有注意。
2014-05-10 08:31
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
想了想应该是你说的这样。但那二行虽与第三行不是互斥,却根本是不适合出现。
2014-05-10 08:34
快速回复:初学者---文件包含可以完全运行,工程文件只可以编译,却链接出错,怎 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012534 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved