链接我的库的错误的多重定义

Posted

技术标签:

【中文标题】链接我的库的错误的多重定义【英文标题】:Multiple definition of error linking my library 【发布时间】:2013-12-30 12:55:50 【问题描述】:

我正在尝试创建一个包含一些我经常使用的函数的库,但编译时出现此错误:

Torri_lib.cpp||multiple definition of `inizRandVett(int*, int, int, int)'|
Torri_lib.cpp||first defined here|
Torri_lib.cpp||multiple definition of `printVett(int*, int)'|
Torri_lib.cpp||first defined here|
Torri_lib.cpp||multiple definition of `scambio(int*, int*)'|
Torri_lib.cpp||first defined here|
||=== Build finished: 6 errors, 0 warnings (0 minutes, 0 seconds) ===|

这是main.cpp:

#include <iostream>        
#include "Torri_lib.h"
#define N 10
using namespace std;

void ordina(int*,int);

int main()
   int vett[N];
    srand(time(NULL));
    inizRandVett(vett,N,-20,20);
    printf("Vettore generato:\n");
    printVett(vett,N);
    ordina(vett,N);
    printf("\n\nVettore ordinato (neg a sx, pos a dx):\n");
    printVett(vett,N);
    printf("\n\n");
    return 0;

void ordina(int*vett,int dim)
   int i,j,neg=0,pos=0;
    for(i=0;i<dim;i++)
        if(vett[i]<0)
           neg++;
        else
           pos++;
   for(i=0,j=neg;i<neg;i++)
        if(vett[i]>=0)
           while(vett[++j]>=0);
           scambio(&vett[i],&vett[j]);
        

这是 Torri_lib.cpp:

#include <iostream>
#include"Torri_lib.h"

void inizRandVett(int *vett, int dim, int rangeMin, int rangeMax)
   int i;
    for(i=0;i<dim;i++)
       vett[i]=rand()%(rangeMax-rangeMin)+rangeMin;


void printVett(int *vett, int dim)
  int i;
   for(i=0;i<dim;i++)
        printf("%d ",vett[i]);



void scambio(int*var1,int*var2)

    int temp=*var1;
    *var1=*var2;
    *var2=temp;

这是 Torri_lib.h :

void inizRandVett(int*, int, int, int );
void printVett(int *, int);
void scambio(int*,int*);

我不明白为什么它告诉我这个错误,我没有看到函数的多个定义。 你能帮助我吗?谢谢!

【问题讨论】:

需要添加标题保护 你不应该有这个问题,因为头文件中没有定义(所以在这个简单的情况下你并不需要头文件保护)。你确定你#includemain.cpp文件中的header文件而不是源文件吗? 我似乎没有看到任何问题,这里也不需要包含保护和#pragma once,因为OP的示例代码中没有多重包含 【参考方案1】:

也许你没有在你的 .h 文件中添加保护?

尝试放在文件开头:

#ifndef TORRI_H_INCLUDED
#define TORRI_H_INCLUDED

最后:

#endif

【讨论】:

【参考方案2】:

需要在头文件中写入防止多次声明:

#pragma once

// code

#ifndef NAME_H_
# define NAME_H_

// code

#endif

【讨论】:

以上是关于链接我的库的错误的多重定义的主要内容,如果未能解决你的问题,请参考以下文章

如何在eclipse中指定链接时使用的库版本?

链接器多重定义错误:为啥 <thread> 似乎定义了我的函数?

链接阶段的多重定义错误

如何使用 hystrix 定义重试次数

尽管在 CMake 中指定了库,但未定义的引用错误(与 libtorch 链接的问题(C++11 ABI?)

GCC 命令行详解 -L 指定库的路径 -l 指定需连接的库名