我可以在C++项目中混合使用c和cpp文件吗?

Bit*_*lue 4 c c++ linker

我有一个项目,其中混合了c文件和cpp文件.链接器向我抛出错误:

undefined reference to <all my functions in the c files>
Run Code Online (Sandbox Code Playgroud)

我重命名所有*.c文件后*.cpp,错误消失.所以我不能混合这些文件或这是一些编译器/链接器选项问题?


我的选择:

GCC C++编译器:

-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
Run Code Online (Sandbox Code Playgroud)

GCC C编译器:

-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`
Run Code Online (Sandbox Code Playgroud)

GCC C++链接器:

-L/usr/include/glib-2.0/glib `pkg-config --libs gtk+-2.0`
Run Code Online (Sandbox Code Playgroud)

既然它说C++ Linker,那是不是意味着c文件中的目标文件无法链接到项目中(默认情况下)?

non*_*kle 14

你需要像这样包装 C代码

extern "C" {
    #include "sample1.h"
}
Run Code Online (Sandbox Code Playgroud)

更好的方法就是在这个StackOverflow问题中,在C头文件中.

使用:

#ifdef __cplusplus
extern "C" {
#endif
Run Code Online (Sandbox Code Playgroud)

所有C头文件的开头.

并使用:

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

所有C头文件的末尾.

  • @ mini-me你暗示之前更容易吗? (2认同)

Sne*_*tel 5

extern "C"是一种方法。另一种方法是假设您的C文件属于(几乎无处不在)已经可以作为C ++进行编译的类别,只是强迫编译器将它们视为C ++(这为它们提供了适当的名称处理功能,以便与您的C ++文件一起使用)。对于GCC,这是-x c++