Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 352
  • Last Modified:

Linkage problems using visual c++ tool

I was trying to connect 2 projects - one in C and the other in C++ to one C++ project.
i converted all the extensions of the C files into cpp ones.
Then , when i tryied to linkage all the project together i got more then 900 errors in the form of

A.obj : error LNK2005 : "unsigned char VAR" (?VAR@3PAPAEA) already defined in B.obj

all the A files that gives the linkage errors are the c files converted into cpp ones.
all the VAR variables that gives the linkage errors are in the file global.h which was belong to the former C project.
i suspected that this is an "IFNDEF" problem in the global.h problems but i don't think this is the case.

any advice of how to solve this errors will be highly appreciated since this question concerned to my final project which i need to finish very soon so thanks in advance
0
haboles
Asked:
haboles
1 Solution
 
AlexFMCommented:
Global variables should be defined by the following way:

// global.h
#ifnfef GLOBAL_H
#define GLOBAL_H

extern int VAR;

// other global variables, all with extern keyword

#endif

// cpp file (define each global variable only in one cpp file, use it in all cpp files where necessary)
#include "Global.h"

int VAR;


0
 
AlexFMCommented:
Global.h file contains all global variables with extern keyword. This doesn't create variable, only defines it's type. To create global variable, it should be written without extern keyword:

extern int VAR;    // like forward declaration

int VAR;    // variable is created

Create variable in only one cpp file. Use it in any cpp file - include "Global.h" to it and compiler is happy.


0
 
rstaveleyCommented:
For the benefit of the C file (assuming you are compiling it as C rather than C++), you should use the following to ensure that the symbol doesn't get C++ name mangling:

header.h
--------8<--------
extern
#ifdef __cplusplus
          "C"
#endif
                int VAR;
--------8<--------

source.c/.cpp
--------8<--------
#ifdef __cplusplus
extern "C"
#endif
                int VAR = 0;
--------8<--------
0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
itsmeandnobodyelseCommented:
>> i converted all the extensions of the C files into cpp ones.

Because of this all sources are C++ sources now.

Name mangling is an issue of functions only.

Regards, Alex

0
 
rstaveleyCommented:
> Name mangling is an issue of functions only.

Stone me you're right... and structs, classes and static data members in classes I now see. Thanks for the correction, Alex.
0
 
habolesAuthor Commented:
thanks all for the quick answers.
good to know that i have place to go now when i have c/c++ question.
0

Featured Post

Become an Android App Developer

Ready to kick start your career in 2018? Learn how to build an Android app in January’s Course of the Month and open the door to new opportunities.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now