You don't say if the problem is with variables or functions. They have different solutions:
variables: the header file must have an 'extern' declaration for a variable, with just one 'C' file containing a definition (same as the extern declaration, but without the word extern in front).
functions: this only happens when you have function bodies in the headers - in which case you should put 'inline' in front of the function definition, so that the function code is embedded into each object module which uses it, and the linker doesn't have to deal with it at all. Function prototypes will not cause duplicate definition errors.
When linking C code and C++ code, you also need to get the name mangling right - which basically means you should surround all the declarations which apply to 'C' objects with the following code when you compile those declarations with a C++ compiler:
extern "C" {
... 'C' declarations
}
You usually see
#if defined(__cplusplus)
extern "C" {
#endif
at the top of header files (an similar code at the bottom) which have been designed to be included in both C and C++ files. This is well covered here - but it doesn't sound like you currently have a name mangling problem, though I expect you will before the project's finished...