欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-26 20:06:34
...

一、问题原因

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文件中对该函数进行声明。

三、举例

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

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

四、其他参考

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");  
}