clang: error: linker command failed with exit code 1 with duplicate symbol _TableLookup in database.o and main.o <p>After changing the code, I got new error in database_definitions.h header file. The error is near the 'extern const Lookup_Table TableLookup[TABLE_COUNT];' and mentioned the error in the code with comments next to it. I also got warning in 'database.c' file near the return &amp;(TableLookup[index]); in the 'Lookup_Table* GetTableMetadata(char *tableName)' function. The error is pasted in the code next to it. Kindly review and help me in solving in this issue.</p> <pre><code>**database.c**: const Lookup_Table TableLookup[TABLE_COUNT]= { { .tableName = "Folder_Table", // .tableInitializer = (void*)&amp;InitFolder_Table, .tableMemory = sizeof(Folder_Table), .columns = 5, .columnNames = {"folderID","field1","field2","field3","field4"}, // Fill out field name metadata .columnSize = {SIZE_OF(Folder_Table,folderID), SIZE_OF(Folder_Table,field1), SIZE_OF(Folder_Table,field2), SIZE_OF(Folder_Table,field3), SIZE_OF(Folder_Table,field4)}, .columnType = {TYPE_INT, TYPE_FLOAT, TYPE_INT, TYPE_FLOAT, TYPE_TEXT}, .subTable = {{.tableName = "Item_Table", .pointerOffset = offsetof(Folder_Table,item)}, {.tableName = "nextRow", .pointerOffset = offsetof(Folder_Table, nextRow)}, {.tableName = "lastRow", .pointerOffset = offsetof(Folder_Table, lastRow)}, {.tableName = "\0", .pointerOffset = 0 }}, }, { .tableName = "Item_Table", // .tableInitializer = (void*)&amp;InitItem_Table, .tableMemory = sizeof(Item_Table), .columns = 4, .columnNames = {"ItemID\0","FolderID\0","field1\0","field2\0"}, .columnSize = {SIZE_OF(Item_Table,itemID), SIZE_OF(Item_Table,folderID), SIZE_OF(Item_Table,field1), SIZE_OF(Item_Table,field2)}, .columnType = {TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_FLOAT}, .subTable = {{.tableName = "nextRow", .pointerOffset = offsetof(Item_Table, nextRow)}, {.tableName = "lastRow", .pointerOffset = offsetof(Item_Table, lastRow)}, {.tableName = "\0", .pointerOffset = 0}}, } }; //==================================================================================== // Struct Table Initializer and metadata functions //==================================================================================== //------------------------------------------------------------------------------------ // Find the memory size of a table specified by name //------------------------------------------------------------------------------------ int GetTableSize(char *tableName) { int index; //// Find function matching function name string for (index=0 ; index &lt; TABLE_COUNT; index++) { if (strcmp(TableLookup[index].tableName, tableName)) { return(TableLookup[index].tableMemory); } } return 1; // Return error, should this be an exception? } //------------------------------------------------------------------------------------ // Return the index of of the table from the table-lookuptable //------------------------------------------------------------------------------------ Lookup_Table* GetTableMetadata(char *tableName) { //// Find function matching function name string for (int index=0; index &lt; TABLE_COUNT; index++) { if (strcmp(TableLookup[index].tableName, tableName)) { `return &amp;(TableLookup[index]);//error: 'Returning 'const Lookup_Table*(aka 'const structLookup_Table') from a function with result type 'Lookup_Table'(aka 'struct Lookup_Table") discards qualifiers`' } } return 0; // Return error } **database.h**: #ifndef database_h #define database_h #include "database_definitions.h" #define ONE_ROW 1 //==================================================================================== // Function Definitions //==================================================================================== int SQLOpen(void); //isc_db_handle SQLGetDatabase(void); Lookup_Table* GetTableMetadata(char *tableName); Sub_Table* GetSubTableMetadata(char *tableName, char *subTableName); #endif **database_definitions.h**: #ifndef database_database_h #define database_database_h extern const Lookup_Table TableLookup [TABLE_COUNT]; //error:unknown type name 'Lookup_Table' //==================================================================================== // SQL Table Metadata Structures //==================================================================================== typedef struct Folder_Table // Table type name gets "_Table" added to the SQLite name { //// Fields // Comments are added to seperate the fields, Relationships, and metadata int folderID; // Fields are added as elements of the type and length listed in SQLite float field1; int field2; float field3; char field4[40]; // string length '40' is queried from SQLite settings for field //// Relationships struct Item_Table *item; // Pointer to the sub-table struct Folder_Table *nextRow; // Linked List Pointer to the next-row struct Folder_Table *lastRow; // Linked List Pointer to the last-row } Folder_Table; typedef struct Item_Table { //// Fields int itemID; int folderID; char field1[32]; float field2; //// Relationships Folder_Table *folder; struct Item_Table *nextRow; struct Item_Table *lastRow; } Item_Table; typedef struct Sub_Table { char tableName [TABLE_NAME_LENGTH]; // Sub-table name int pointerOffset; // Sub-table pointer memory offset in the struct }Sub_Table; typedef struct Lookup_Table { char tableName [TABLE_NAME_LENGTH]; // Stores table name void (*tableInitializer)(void *); // Pointer to the initializer function int tableMemory; // Size of the table memory instance int columns; // Number of columns in the table char columnNames[MAX_COLUMNS][COLUMN_NAME_LENGTH]; // Array of column names int columnSize [MAX_COLUMNS]; // Array of column variable memory sizes int columnType [MAX_COLUMNS]; // Array of column variable types Sub_Table subTable [MAX_SUB_TABLES]; // Stores sub-table pointers }Lookup_Table; #endif **main.c**: #include &lt;stdio.h&gt; #include "database.h" int main(int argc, const char * argv[]) { // SQLOpen(); return 0; } </code></pre>