0

我正在尝试在 Linux 环境中执行 C 和 C++ 中的基本代码。我正在使用eclipse来运行它。当前项目创建为 C 项目。

我要做的就是从同一文件夹中的不同文件调用一个函数。我有我的 main sample.c,在 main 我想调用函数sum(int a, int b)in A.c。我能够运行它。A.cpp但是,当我在(C++ 模板文件)中重写相同的函数 sum 时,它会引发链接器错误。

gcc  -o "Test"  ./sample.o 

./sample.o: In function main':/home/idtech/workspace/Test/Debug/../sample.c:19: undefined reference to sum' collect2: ld 返回 1 exit status make: * [Test] Error 1

我需要帮助从同一文件夹中的 C 文件调用 C++ 文件中的函数。请帮我解决这个链接器问题。

谢谢

哈沙

4

1 回答 1

2

C++ 编译器会修改符号名称以对类型信息进行编码。通常,在编写应该暴露给 C 代码的 C++ 函数时,您需要将函数包装在一个extern "C" { ... }块中,就像这样(或者只是extern "C"像 @DaoWen 指出的那样在它前面加上前缀):

A.cpp:

extern "C" {
    int sum(int a, int b)
    {
        return a+b;
    }
}

调用者.c:

extern int sum(int a, int b);
...
int main() { sum(42, 4711); }

通过将函数标记为extern "C",你牺牲了重载它的能力,因为不同的重载只能通过它们的重载符号名称来区分,而你只是要求关闭重载!这意味着您不能这样做:

extern "C" {
    int sum(int a, int b) { return a+b; }
    float sum(float a, float b) { return a+b; } // conflict!
}
于 2013-07-12T17:04:58.303 回答