Почему я получаю повторяющийся символ при объявлении этой общедоступной функции-члена в другом файле? (C ++) - PullRequest
0 голосов
/ 06 февраля 2011

Хорошо, поэтому я настраивал довольно простой класс в C ++ для обработки изменения функций, которые я хочу использовать с GLUT. Но у меня возникают проблемы при определении одной из открытых функций-членов в файле .cpp, который соответствует заголовочному файлу, содержащему определение класса.

Когда я определяю класс в заголовочном файле, я не получаю никаких ошибок компиляции. Но когда я определяю функцию в файле .cpp, с включенным заголовочным файлом, я получаю сообщение об ошибке "duplicate symbol SystemModule::setupGlutFunctions". Насколько я могу судить, я использую правильный синтаксис для определения этой функции в отдельном файле, чем в оригинале. Вот код:

#include "system.h"

void SystemModule::setupGlutFunctions()
{
glutDisplayFunc(displayFunc);
glutReshapeFunc(reshapeFunc);
glutMouseFunc(mouseFunc);
glutKeyboardFunc(keyboardFunc);
glutSpecialFunc(specialFunc);
glutIdleFunc(idleFunc);
glutMotionFunc(motionFunc);
glutPassiveMotionFunc(passiveMotionFunc);

return;
}

Фактическое содержимое кода на самом деле не имеет значения, так как оно прекрасно компилируется, когда оно объявлено в файле .h внутри определения класса. Но когда я пытаюсь определить функцию в отдельном файле .cpp, я получаю сообщение об ошибке. Это публичная функция.

Я использую Xcode в Mac OS X 10.5. Кто-нибудь еще получил эту ошибку раньше? И кто-нибудь может сказать мне, если я делаю что-то неправильно в синтаксисе или мне нужно сделать что-то особенное в Xcode, чтобы это работало?

Очень благодарен, E.

1 Ответ

3 голосов
/ 06 февраля 2011

Это похоже на компоновщик ошибка, а не компилятор ошибка, которая предполагает, что вы как-то компилируете две разные копии setupGlutFunctions кода и пытаетесь связать их вместе,Это может быть связано с тем, что у вас есть два разных файла с одинаковой реализацией, которые связаны друг с другом.

Один из возможных кандидатов - вы #include задаете файл .cpp в конце файла .h?Если это так, любой файл, который #include s ваш заголовочный файл, получит собственную копию реализации setupGlutFunctions.Во время компоновки компоновщик увидит, что функция имеет несколько разных определений, и выдаст ошибку, потому что не уверен, какую из множества идентичных реализаций вы искали.

Другой возможный кандидат (упомянутый выше@DougT) - если вы случайно указали реализацию в заголовке, например, так:

class SystemModule {
public:
    void setupGlutFunctions() {
        /* ... */
    }
};

Затем вы фактически определили две реализации функции - одну в заголовке и одну в файле .cpp.Если изменить это на

class SystemModule {
public:
    void setupGlutFunctions();
};

, это можно исправить.

...