Что вызывает ld: дублированный символ - PullRequest
2 голосов
/ 16 января 2012

ld: дубликат символа StringFunctions :: intToString (int) в

/Build/Intermediates/Y36PJC-mrvikmil.build/Debug/Y36PJC-mrvikmil.build/Objects-normal/x86_64/ServerSocket.o and 
/Build/Intermediates/Y36PJC-mrvikmil.build/Debug/Y36PJC-mrvikmil.build/Objects-normal/x86_64/main.o 

для архитектуры x86_64

функция StringFunctions :: intToString (int) находится в StringFunctions.h

включает в себя main.cpp :

#include <iostream>
#include <string>
#include "Exception.h" //does not include anything more
#include "ServerConsole.h"
    /* 
       which includes ServerSocket.h which includes ClientSocket.h which includes StringFunctions.h
       AND
       ServerSocket.h includes SocketException.h which includes StringFunctions.h
    */

включает в себя ServerSocket.cpp :

#include <iostream>
#include <string>
#include "InvalidPortException.h" //does not include anything more
#include "SocketException.h" //which includes StringFunctions.h
#include "ClientSocket.h"    //which includes SocketException.h which includes StringFunctions.h
#include "StringFunctions.h" //StringFunctions.h

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <errno.h>

Я считаю, что, пока у меня есть файлы в .h файлах, я могу включать в себя практически все, что угодно ...

Все мои файлы включают в себя guard (#ifndef ... #define ...)

Пожалуйста, помогите.

1 Ответ

5 голосов
/ 16 января 2012

Вы должны определить функцию как inline или перенести ее реализацию в файл cpp. В противном случае он будет существовать в обоих объектах, и C ++ не будет знать, какой из них (несмотря на их идентичность) связать.

Включая охрану, вы не будете иметь один и тот же заголовок несколько раз в одном и том же кодовом файле / объекте. Однако они не избежат наличия одного и того же фрагмента кода в нескольких объектных файлах, поскольку каждый из них создается сам по себе со всеми определениями сброса.

...