Why does global variables in a header file cause link error?

c, include-guards

Solution

Lines like

const char    *Bittorrent     =   "BitTorrent protocol";
const char    eight_byte[8]   =   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

define theses global variables no matter if that codes is in header file or ine a .c directly (`#include` is just textual insertion of the header's contents). Instead you should have the definitions in exaclty one source file and change the header to provide an `extern` declaration instead:

extern const char *Bittorrent;
extern const char *eight_byte;

Then all your sources using thes variables can be compiled but the linker will the variables once only.

Problem

I always get the following error, even if I have put include guard in header file. ``` duplicate symbol _Bittorrent in: /Users/tracking/Library/Developer/Xcode/DerivedData/SHT-giuwkwyqonghabcqbvbwpucmavvg/Build/Intermediates/SHT.build/Debug/SHT.build/Objects-normal/x86_64/main.o /Users/tracking/Library/Developer/Xcode/DerivedData/SHT-giuwkwyqonghabcqbvbwpucmavvg/Build/Intermediates/SHT.build/Debug/SHT.build/Objects-normal/x86_64/Handshake.o duplicate symbol _eight_byte in: /Users/tracking/Library/Developer/Xcode/DerivedData/SHT-giuwkwyqonghabcqbvbwpucmavvg/Build/Intermediates/SHT.build/Debug/SHT.build/Objects-normal/x86_64/main.o /Users/tracking/Library/Developer/Xcode/DerivedData/SHT-giuwkwyqonghabcqbvbwpucmavvg/Build/Intermediates/SHT.build/Debug/SHT.build/Objects-normal/x86_64/Handshake.o ld: 2 duplicate symbols for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) ``` Here are .h header file, .c file, and main.c main.c ``` #include "Handshake.h" int main(int argc, char** argv) { // some code. return 0; } ``` Handshake.h ``` #ifndef SHT_Handshake_h #define SHT_Handshake_h const char *Bittorrent = "BitTorrent protocol"; const char eight_byte[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; #endif ``` Handshake.c ``` #include "Handshake.h" int Send_fisrt_Handshake(download_connection *pPeer, Handshake *necessary_info) { //some statements return 1; } void Set_Handshake_information(TorrentFile* pArg, Handshake *pYours) { //some statements } ``` But, If I deleted global variables from header file, these codes compile successfully. I don't understand why. Could someone explain why? Thank you in advance.

Original source