Извините, наконец, я понял. Я осмотрел свою модель. Вот проблема.
class InsertScript < ApplicationRecord
enum prev_or_next: {"prev": 1, "next": 2}
enum activate: {"active": true, "non_active": false}
default_scope { where("activate = true") }
Это определение перечисления внесло некоторый вред. Когда я устранил это, оно восстановилось.
Почему делают Вас #include lines.cpp в ThreeD.cpp? Это очень необычно.
Ваш make-файл хочет lines.o, таким образом, Вы собираетесь скомпилировать lines.cpp. Что-либо определенное в lines.cpp будет в lines.o и также в ThreeD.o.
В lines.cpp существует интригующий комментарий:
Don't forget to put declarations in your .h files.
Я думаю, что преподаватель хочет, чтобы Вы повредили lines.cpp в.h и .cpp.
Выборка от lines.cpp:
/* These go in your .h file or in lines.h */
/*
Line drawing header.
*/
void draw_line(float, float, float, float);
int near_far_clip(float, float, float *, float *, float *, float *,
float *, float *);
Я подозреваю, что эти два объявления являются единственной вещью, которая должна быть в lines.h.
Вы, вероятно, включаете функциональные определения в заголовочный файл. Включайте inline
ключевое слово, таким образом, они не экспортируются каждым объектным файлом или вставляют их их собственное .cpp
файл.
Для Вашей глобальной переменной необходимо использовать extern
ключевое слово в Вашем заголовочном файле. Иначе каждый объектный файл экспортирует их собственную переменную, и компоновщик запутывается, относительно которого корректный для использования.
Отправьте некоторые фрагменты кода. Возможно, Вы определяете свои методы и в объявлении класса и в снаружи?
class X {
void foo(); // No definition, just declaration
void bar() {} // Declaration + definition
};
void X::foo() {} // First Definition, OK
void X::bar() {} // Already defined, ERROR
Как был сказан - недостаточно информации для надлежащего диагностирования здесь.
Но если draw_line
и др. определяются в заголовочном файле, а не в источнике (cpp) файл, у Вас могут быть методы, которые, предположительно, объявляются как встроенные в заголовочном файле, которые на самом деле правильно не встраивают. В этом случае каждый .cpp файл, который включает заголовок, генерирует их собственное определение draw_line
функция, и генерирует предупреждения во время ссылки.
Это может произойти при использовании #defined ВСТРОЕННЫЙ макрос, который прибывает из системного заголовка, о котором забыли или удалили, и по любой причине ВСТРОЕННОЕ не предварительно обрабатывается далеко ни во что.
Например:
//Lines.h
#define GCCC //Note the typo
#if defined(GCC)
#define INLINE inline
#elif defined (MSVC)
#define INLINE __inline
#else
#define INLINE //Due to the typo, INLINE will be turned into nothing
#endif
INLINE void draw_line(float x1, float y1, float x2, float y2)
{
//Draw the line
}
//File1.cpp
#include "lines.h" //will define draw_line
//File2.cpp
#include "lines.h" //will also define draw_line
И соединение File1.cpp и File2.cpp генерирует ошибки многократного объявления
Проверка включает защиту в орфографическую ошибку.
Проверьте Ваш делать опции, возможно, кто-то скомпилировал в несколько объектных файлов.
Попытайтесь исключить части файлов и кода, пока не не найдут причину ошибок.
ОТРЕДАКТИРОВАННЫЙ:
зафиксируйте включают *.cpp файлы. Они, должен быть связан.
Ошибки повторного определения являются ошибками компоновщика, но без большей информации трудно диагностировать их. Проверьте, что тот же файл не появляется дважды в команде компоновщика и что Ваши заголовочные файлы содержат только объявления, никакие определения.
Не видя код нет действительно никакой помощи Вам. Компилятор ясно требует противоположности Вас (существует по крайней мере одно дублирующееся определение).
Попытайтесь воспроизвести ошибку с минимальным примером. Вы попытались компилировать код вне Eclipse в командной строке? С какой результат?
Привет! Я вижу, что основное правило применяется ко всем. Я объясню, как работают такие ошибки и что они возникают: Возьмем один пример из «Создание глобальной переменной»
Не путайте заголовочный файл с файлом cpp. Заголовок нужен только для того, чтобы несколько файловых проектов могли иметь общий интерфейс перед связыванием.
1. Элемент списка
Вы должны указать информацию о глобальной переменной в заголовке:
extern int Var_Global;
Элемент списка
, сохранив при этом Фактический код в
cpp:
int Var_Global;
И убедитесь, что вы 1. включили заголовок и 2. связали код.
Свяжите код один раз и только один раз, и будет только одна копия данных, как бы вы ни включали заголовки в течение всего дня, это говорит другому коду, что будет копия данных во время компоновки.
Я вижу, что многие люди помещают код в файлы заголовков, в то время как это может работать в в некоторых случаях это плохая привычка, которая рано или поздно вызовет проблемы. позже.
С уважением,
Прашанта