Can I mix c and cpp files in a C++ project?

2019-07-07 10:16发布

问题:

I have a project that had c files and cpp files mixed in it. The linker throws errors at me:

undefined reference to <all my functions in the c files>

After I rename all *.c files to *.cpp the errors vanish. So can't I mix those files or is this some compiler/linker options problem?


My options:

GCC C++ Compiler:

-I/usr/include/glib-2.0 -I/usr/include/gtk-2.0 -I"/myPath" -O0 -g3   \
    -Wall -c -fmessage-length=0 `pkg-config --cflags glib-2.0 gtk+-2.0

GCC C Compiler:

-I/usr/include/glib-2.0 -I/usr/include/gtk-2.0 -I"/myPath" -O0 -g3   \
    -Wall -c -fmessage-length=0 -std=c99 `pkg-config --cflags glib-2.0 gtk+-2.0`

GCC C++ Linker:

-L/usr/include/glib-2.0/glib `pkg-config --libs gtk+-2.0`

Since it says C++ Linker, does that mean object files from c files cannot be linked into the project (by default)?

回答1:

extern "C" is one approach. The other approach, assuming your C files are of the (almost ubiquitous) sort which are already compilable as C++, is simply to coerce the compiler into treating them as C++ (which gives them the appropriate name mangling to work with your C++ files). For GCC, this is -x c++.



回答2:

You need to wrap the C code like so

extern "C" {
    #include "sample1.h"
}

A better way to do it is like in this StackOverflow question, in the C header files.

use:

#ifdef __cplusplus
extern "C" {
#endif

At the start of all C header files.

and use:

#ifdef __cplusplus
}
#endif

At the end of all C header files.



标签: c++ c linker