使用类时链接期间的简单C ++未定义引用错误

时间:2014-09-18 10:18:30

标签: c++ class g++ linker-errors undefined-reference

我认为我遇到了一个简单的问题。但是,就我不熟悉C ++编程而言,我无法解决它。我创建了一个新的C ++项目,使代码尽可能简短(因为原始代码要长得多),同时保持我的问题。我在Stackoverflow和谷歌上搜索了大约50个相关问题,但到目前为止还没有任何帮助我解决它。将所有内容放在一个cc和一个h文件中可以正常工作,但这不是我喜欢做的事情。在此先感谢您的帮助。

我使用的是Ubuntu 14.04 / Code :: Blocks 13.12 / gcc和g ++ 4.8.2

问题是我想访问在不同文件中定义的类中的函数,并且在编译工作时(由于file1.h中的extern)链接失败。如果我只是把"简单的S1;"而不是" extern Simple S1;"在file1.h并从file1.cc中删除它我得到一个多重声明错误,这是预期的。显然" extern"诀窍不适用于类,而它适用于变量。

file1.h:

#ifndef FILE1_H
#define FILE1_H

class Simple
{
    private:
    unsigned int length = 10;

    public:
    void SetLength(unsigned int l) {length = l;}
    unsigned int GetLength() {return length;}
};

extern Simple S1;

#endif

file1.cc:

#include <iostream>
#include "file1.h"
#include "file2.h"

int main()
{
    Simple S1;
    unsigned int l = GetL();
    std::cout << "length=" << l << "\n";
    l = 20;
    l = GetL();
    std::cout << "length=" << l << "\n";
    return 0;
}

file2.h:

#ifndef FILE2_H
#define FILE2_H

unsigned int GetL();

#endif

file2.cc:

#include "file1.h"
#include "file2.h"

unsigned int GetL()
{
    return S1.GetLength();
}

构建命令和错误:

g++ -std=c++11 -Wall -fexceptions -g  -c file1.cc -o obj/Debug/file1.o
g++ -std=c++11 -Wall -fexceptions -g  -c file2.cc -o obj/Debug/file2.o
g++  -o bin/Debug/Test obj/Debug/file1.o obj/Debug/file2.o   
obj/Debug/file2.o: In function `GetL()':
file2.cc:6: undefined reference to `S1'
collect2: error: ld returned 1 exit status

2 个答案:

答案 0 :(得分:0)

如果S1是全局的,则必须在全局范围内定义,而不是在main()内定义,这将创建该函数的本地新实例。

Simple S1;放在函数中的main()之前。

#include <iostream>
#include "file1.h"
#include "file2.h"

Simple S1;

int main()
{
    unsigned int l = GetL();
    std::cout << "length=" << l << "\n";
    l = 20;
    l = GetL();
    std::cout << "length=" << l << "\n";
    return 0;
}

答案 1 :(得分:0)

extern Simple S1;

此声明承诺在代码中的其他位置存在类型为S1的全局对象Simple。但你永远不会定义这样的对象。您最接近的是S1内的局部变量main(),但当然,这是完全不同的事情。

所以,只需将S1的定义移到main()之外:

Simple S1;

int main()
{
    unsigned int l = GetL();
    std::cout << "length=" << l << "\n";
    l = 20;
    l = GetL();
    std::cout << "length=" << l << "\n";
    return 0;
}