链接器错误:重复的函数

时间:2017-08-28 14:18:03

标签: linker-errors turbo-c++

注意:我制作了一个DFH_lib.CPP,其中包含了fstream和iomanip。我将所有模板函数保存在DFH_lib.CPP中。现在,如果我在MAIN.CPP中编写剩余的NON-TEMPLATE函数并包含DFH_lib.h,那么它就会成功运行。我不明白为什么......

我正在使用模板制作数据文件处理库。我创建了两个文件:

DFH_lib.CPP
Lib_Test.CPP

我制作了一个项目并点击了#34; Build All"正在编译中。我遇到了以下链接器错误:

  模块DFH_LIB.CPP中定义的

file_init(char near *)在模块LIB_TEST.CPP中重复

     

模块DFH_LIB.CPP中定义的AddColumn(const int near&)在模块LIB_TEST.CPP中重复

file_init(char*);AddColumn(T data, const int& width);以及AddColumn(const int& width);是我仅在DFH_lib.CPP中定义的函数。我只在Lib_Test.CPP中调用了这些函数。

DFH_lib.CPP

template <class T>    //Function belongs to Pretty Printing Libary
void AddColumn(T data, const int& width) {
    cout<<setw(width)<<data<<" | ";
}
void AddColumn(const int& width) {
    cout<<setw(width)<<setfill('_')<<"|";
}
void file_init(char* file) {   //File initialization function
    ofstream fout;
    fout.open(file, ios::binary|ios::noreplace);   //File Created, noreplace prevents data loss
    fout.close();
}

Lib_Test.CPP

cout<<endl; AddColumn(record_id,7); AddColumn(char_member, 20); AddColumn(int_member, 11); AddColumn(float_member, 13);
file_init(file);    //initializes the file

其中&#34;文件&#34;定义为:char file[]="lib_Test.dat";

有人可以解释为什么我收到此链接器错误?我不明白这意味着什么,因此,如何解决它......

修改 我注意到这可能是由于在包含文件时出错而导致的,因为我将Lib_Test.CPP转换为&#34; Hello World&#34;程序和出现相同的错误。还有一件事我注意到:只有非模板函数导致链接错误!

DFH_lib.CPP

#ifndef _DFH_lib_cpp
#define _DFH_lib_cpp

#include<fstream.h>
#include<conio.h>
#include<stdio.h>
#include<iomanip.h>
#include<string.h>
.....
#endif

Lib_Test.CPP

#include<iostream.h>
#include<conio.h>
#include"DFH_lib.CPP"  //Including DFH Libary

1 个答案:

答案 0 :(得分:0)

我看到了以下问题的原因:

  1. 编译错误

    TC ++ 有时会编译模板问题,通常会添加空行(在正确的位置)或交换一些代码行帮助。但是,这通常仅在您的源代码达到30-50 Kbyte这样的特定大小时才会开始,而不再确定它在很久以前的价值。我不相信这是你的问题。

  2. 真的重复

    如果您多次包含某个文件,则会导致像您这样的错误。要解决这个问题,您可以将每个文件封装到此:

    #ifndef _DFH_lib_cpp
    #define _DFH_lib_cpp
    // here comes your file DFH_lib.cpp content
    #endif
    

    其中_DFH_lib_cpp令牌是您正在封装的编码文件名。这将丢弃任何重复包含。这也解决了存在全局变量的问题,但要小心,如果没有正确包含,它们在整个项目中可能不一样。