从多个文件编译给出“未定义的引用”

Compiling from multiple files gives "undefined reference"

提问人:UtahJarhead 提问时间:10/17/2017 更新时间:10/17/2017 访问量:1903

问:

我需要在单独的文件中提供一个 CFG 类,但我不确定如何将其与关联的程序和主程序一起编译。.h

我已经编辑了 .h 文件,并在命令行中要求提供这两个文件,但我不确定为什么将它们编译在一起是错误的。#include

思潮?

CFG.cpp:

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

class CFG
{
    public:
        string code[25];
        char startNT;
    //private:

    CFG(string inCode[], int stringLen)
    {
        for (int a = 0; a < stringLen; a++)
        {
            //cout << inCode[a] << endl;
            this->code[a] = inCode[a];
        }
        for (int a = 0; a < stringLen; a++)
        {
            cout << this->code[a] << endl;
        }
    }

    char getStartNT()
    {
        return startNT;
    }

    void setStartNT(char stNT)
    {
        startNT = stNT;
    }

    bool processData(string inString, string wkString)
    {
        //Our recursive function
        return true;
    }

    void garbage()
    {
        return;
    }
};

CFG.h:

#ifndef _cfg_h_
#define _cfg_h_

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

class CFG
{
    public:
        string code[25];
        char startNT;

        CFG(string inCode[], int stringLen);
        char getStartNT();
        void setStartNT(char stNT);
        bool ProcessData(string inString, string wkString);
        void garbage();
};

#endif

cfg_entry.cpp:

#include <stdio.h>
#include <iostream>
#include "cfg.h"

using namespace std;

int main()
{
    string inArray[5];
    inArray[0] = "test0";
    inArray[1] = "test1";
    inArray[2] = "test2";
    inArray[3] = "test3";
    inArray[4] = "test4";
    CFG * cfg1 = new CFG(inArray, 5);
    cfg1->garbage();
    return 0;
}

编译错误:

art@tv:~/Dropbox/Weber/CS 4110/Individual Assignment 2$ g++ -g -std=c++11 -Wall -o cfg_entry cfg.cpp cfg_entry.cpp
/tmp/ccICQEd0.o: In function `main':
/home/art/Dropbox/Weber/CS 4110/Individual Assignment 2/cfg_entry.cpp:15: undefined reference to `CFG::CFG(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, int)'
/home/art/Dropbox/Weber/CS 4110/Individual Assignment 2/cfg_entry.cpp:16: undefined reference to `CFG::garbage()'
collect2: error: ld returned 1 exit status
C++ C++11 编译器错误 链接器错误 未定义引用

评论

0赞 Ken White 10/17/2017
什么是未定义的引用/未解析的外部符号错误以及如何修复它?
1赞 Brandon 10/17/2017
您在 .cpp 文件中重新实现了整个类。这不是你实现函数的方式。仅适用于类中的每个函数。 注意:构造函数和析构函数没有返回类型。returnType className::func(parameterType parameter...) {..body..}
0赞 Cheers and hth. - Alf 10/17/2017
.cpp 文件中的类定义是不允许的类重定义。无需再次定义类。只需定义成员函数即可。
0赞 Cheers and hth. - Alf 10/17/2017
在其他新闻中:在 C++ 中,为宏保留所有大写是个好主意。
0赞 Brandon 10/17/2017
示例:ideone.com/nOG2aC

答:

1赞 UtahJarhead 10/17/2017 #1

我找到了我的问题。就我而言,头文件正在定义类,而 .cpp 文件再次重新定义它,尝试创建 CFG 类的 2 个实例。 .h 需要处理类声明和变量实例化,而 .cpp 只处理函数定义。

cfg.h:

#ifndef _cfg_h_
#define _cfg_h_

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

class CFG
{
    private:
        string code[25];
        char startNT;

    public:
        CFG(string inCode[], int stringLen);
        char getStartNT();
        void setStartNT(char stNT);
        bool processData(string inString, string wkString);
        void garbage();
};

#endif

cfg.cpp:

#include <iostream>
#include <stdio.h>
#include <string>
#include "cfg.h"

using namespace std;

CFG::CFG(string inCode[], int stringLen)
{
    for (int a = 0; a < stringLen; a++)
    {
        //cout << inCode[a] << endl;
        this->code[a] = inCode[a];
    }
    for (int a = 0; a < stringLen; a++)
    {
        cout << this->code[a] << endl;
    }
}

char CFG::getStartNT()
{
    return startNT;
}

void CFG::setStartNT(char stNT)
{
    startNT = stNT;
}

bool CFG::processData(string inString, string wkString)
{
    //Our recursive function
    return true;
}

void CFG::garbage()
{
    return;
}