【问题标题】:Can I mix c and cpp files in a C++ project?我可以在 C++ 项目中混合 c 和 cpp 文件吗?
【发布时间】:2013-12-05 18:54:00
【问题描述】:

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

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

在我将所有 *.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

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`

GCC C++ 链接器:

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

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

【问题讨论】:

    标签: c++ c linker


    【解决方案1】:

    你需要像这样包装 C 代码

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

    更好的方法是在 C 头文件中的 this StackOverflow question 中。

    使用:

    #ifdef __cplusplus
    extern "C" {
    #endif
    

    所有 C 头文件的开头。

    并使用:

    #ifdef __cplusplus
    }
    #endif
    

    所有 C 头文件的末尾。

    【讨论】:

    • 嗯,在大多数情况下这会起作用,但它有点麻烦。最好小心地将extern "C"s 放在标头中,或者创建一个新标头供C++ 使用,或者检测您何时编译为C++,如the question you linked 中所述。
    • @BoBTFish 你和我都链接到同一个问题。请参阅我发布的第二个链接。
    • 我会改写和修正,最好说清楚。
    • 伙计,现在开始用 C/C++ 编码太难了 :-( 谢谢,这解决了很多问题。
    • @mini-me 你是在暗示以前更容易吗?
    【解决方案2】:

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

    【讨论】:

    • 这看起来是一个更好的解决方案,不是吗? (因为我不必用包装器污染代码),more reference
    • 视情况而定。我说“几乎无处不在”,但是有一个奇怪的 C 库,它有一个名为 class... 的变量,它不适用于预编译的 C 库。但是,是的,当它起作用时,与extern "C" 相比,遇到的问题要少得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 2012-10-22
    • 2014-07-25
    相关资源
    最近更新 更多