链接报错:ld: 1 duplicate symbol for architecture x86_64

来源:互联网 发布:淘宝客服的提成怎么算 编辑:程序博客网 时间:2024/05/16 05:50

一、问题原因

ld: 1 duplicate symbol for architecture x86_64
出现错误的原因是:重复定义

完整的报错信息:
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
即:在链接阶段,发现“重复定义”。

问题原因:
在.h文件中定义实现了“非内联的”“独立函数”。

这种情况下,该.h文件每被include一次,其中的“非内联的”“独立函数”都会被定义实现一次,所以就“重复定义”。
这也是解释了:“重复定义”为什么没有在“编译阶段”报错,而是等到“链接阶段”才报错。

如果这个独立函数是内联的,由于是在被调用处直接展开,所以不会有“重复定义”的问题。

对了,所谓“独立函数”是指“不是某个类的成员方法的那些‘游离’函数”

二、解决方式

将“非内联的”“独立函数”的定义实现从.h文件挪到.cpp文件,然后在.h文件中对该函数进行声明。

三、举例

这里写图片描述

这里写图片描述

四、其他参考

http://blog.csdn.net/u010282836/article/details/25954997

这篇文章中提到的另一种情况:
include了.c文件。

我X,“include了.c文件”?怎么会有这种人?
anyway,原理是一样的,即“非内联的”“独立函数”被重复定义了。

文章内容贴于后文。


最近使用Xcode编译C语言程序,发现在多文件运行时总会有error提示:

ld: 1 duplicate symbol for architecture x86_64  clang: error: linker command failed with exit code 1 (use -v to see invocation)  

在网上查了一下:
duplicate symbol的大概意思是,编译器认为你重复定义了一些东西。
linker command failed with exit code 1,则可能是项目引入了多个相同的文件
解决方法:
先看看main.c文件是不是包含了自己写的.c文件,例如:

#include "addressPrint.c"  

如果是,删除该语句,使用到自定义文件的函数前声明一下,ok。

void  print1(int *ptr,int rows);  int main(int argc, const char * argv[])  {      // insert code here...      printf("Hello, World!\n");      int one[] = {0,1,2,3,4};      print1(one, 5);      return 0;  }  

编译器会自动找到在addressPrint.c文件里的方法:

void print1(int *ptr,int rows){      /*      print out a one-dimensional array using a pointer      */      int i;      printf("Address Contents\n");      for (i=0; i<rows; i++) {          printf("%8u%5d\n",ptr + i,*(ptr + i));      }      printf("\n");  }  

阅读全文
0 0
原创粉丝点击