Вложенный класс, неопределенная ссылка, статический метод - PullRequest
2 голосов
/ 03 ноября 2011

У меня есть проблема, и я не знаю, как ее решить.Я считаю, что это глупо тривиально:

У меня есть 3 файла:
Util.hpp

class Util  
{  
    public:  
        class BitParser  
        {
            public:
                static bool getBitAt(int buf, int idx);  
        };  
};  

Util.cpp

#include "Util.hpp"
bool Util::BitParser::getBitAt(int buf, int idx)
{
    return true;
}

application.cpp

#include "Util.hpp"
int main(int argc, char* argv[])
{
    Util::BitParser::getBitAt(1,1);
}

Конечно, файлы, перечисленные выше, находятся в том же каталоге.И теперь, когда я пытаюсь связать и скомпилировать, я получаю ошибку компоновщика:

$ g++ -o app application.cpp
application.cpp:(.text+0x19): undefined reference to `Util::BitParser::getBitAt(int, int)'
collect2: ld returned 1 exit status

Что облажалось?

Ответы [ 3 ]

4 голосов
/ 03 ноября 2011

Вы сказали g ++ скомпилировать «основную» программу, но не рассказали о модуле Util.Добавьте Util.cpp в командную строку, и все должно работать хорошо.

Компилятор создал файл "application.o", который ссылается на Util::bitparser функции.

Компоновщик должен «связать» эти ссылки с файлом «util.o», содержащим фактический код для этих функций.Но у него нет .o файла, содержащего функцию, удовлетворяющую ссылке.Вот что он называет «неопределенная ссылка»: «application.o» ссылается на функцию, которую компоновщик не находит.

3 голосов
/ 03 ноября 2011

Вам необходимо скомпилировать (и связать) все файлы .cpp. Так что в вашем случае команда будет

$ g++ -o app application.cpp Util.cpp

Еще лучше, напишите Makefile, чтобы сделать это для вас.

2 голосов
/ 03 ноября 2011

В сборку необходимо включить и application.cpp, и Util.cpp.

...