我有一个项目,其中混合了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头文件的末尾.
extern "C"
是一种方法。另一种方法是假设您的C文件属于(几乎无处不在)已经可以作为C ++进行编译的类别,只是强迫编译器将它们视为C ++(这为它们提供了适当的名称处理功能,以便与您的C ++文件一起使用)。对于GCC,这是-x c++
。