Неопределенная ссылка с использованием пространства имен C

#c #namespaces #undefined-reference

#c #пространства имен #неопределенная ссылка

Вопрос:

Когда я хочу запустить код, компилятор говорит undefined reference to math::calc

Я прочитал вопросы и ответы об этой проблеме в StackOverflow, и это не помогло мне решить мою проблему.

Comp.h

 #include <utility>
namespace math {
    typedef std::pair<double,double> Comp;
    double getFirst(Comp a);
    ...
}

 

Comp.cpp

 #include "comp.h"
namespace math {
    double getFirst(Comp a) {
        return a.first;
    }
    ...
}
 

Comp файл: каждая функция возвращает Comp или double . Я вызываю функцию из cal.cpp файла несколько раз

cal.h

 #include "comp.h"
#include "helper.h"
namespace math {
    Comp calc(const stringamp; str);
    ...
}
 

cal.cpp

 #include "eval.h"
namespace math {
    Comp calc(const stringamp; str) {
        ...
    }
}
 

Cal файл: некоторые функции возвращают comp тип, а не только cal функцию.

helper.h

 namespace math {
    ...
}
 

helper.cpp

 #include "helper.h"
namespace math {
    ...
}
 

helper файл содержит всего несколько функций, которые я вызываю из cal.cpp файла. Каждая функция вызывается несколько раз.

main.cpp

 #include "calc.h"
int main() {
    string str = "  ";
    pair<double,double> res = math::calc(str);
    cout << res.first << " " << res.second << endl;
    return 0;
}
 

Во всем проекте я не использую никаких классов.

Я включил все файлы, которые я вызывал, кроме исходного файла c .

Я использую пространство имен std в каждом файле, но я не пишу его здесь.

Я абсолютно не представляю, в чем может быть проблема с моим кодом.

Если я также включаю cal.cpp в main.cpp редактор кода, он сообщает undefined reference каждому файлу, из которого я вызываю helper.h . Я не хочу включать cal.cpp в main файл, о котором я только что упомянул

Комментарии:

1. Вы уверены, что ошибка исходит от редактора кода, а не от компилятора? Иногда редактор неправильно интерпретирует вещи в больших кодовых базах. Для этого вам нужно повторно проанализировать файл или просто оставить его (если компилятор компилирует его нормально).

2. Компилятор также выдает мне ошибку

3. Когда возникает ошибка? Во время компиляции или при связывании модулей?

4. Также, каково имя файла — вы указали cal.h , а не calc.h

5. Во время компоновки модулей

Ответ №1:

Вы должны скомпилировать все файлы * .cpp вашего проекта, а затем правильно связать их (результаты компиляции) — процесс связывания зависит от среды / IDE, которую вы используете, просто посмотрите. Если вы не связываете его должным образом, конечный исполняемый файл не будет иметь всех определений функций, которые требуются, следовательно, получая неопределенную ссылку.

Комментарии:

1. Другая странная вещь, если я не использую cal.h file и не добавляю cal.cpp file в main.cpp file, я могу запустить код, и он работает нормально

2. Это не странно, содержимое файла (либо .h, либо .cpp) «вставляется» в main.cpp . директива include в c просто «копирует» содержимое включаемого файла. Поэтому в этом случае все содержимое cal.cpp файл включается в main.cpp и, следовательно, все определения функций доступны — следовательно, нет «неопределенной ссылки».

3. Еще раз, сначала скомпилируйте все файлы cpp, чтобы у вас были двоичные эквиваленты этих файлов, затем свяжите их вместе, чтобы получить конечный исполняемый результат

4. Сейчас это работает, мне просто нужно перестроить проект, я сказал странные вещи, о которых я не знаю, что может произойти. К счастью, это работает, и я узнал кое-что, чего раньше не знал