如何从C调用C ++函数?

时间:2012-12-21 22:21:10

标签: c linker

  

可能重复:
  How to call a lib written in C++ from C?

我正在修补pHash,我想调用函数从文件位置生成感知哈希。当我尝试调用名为ph_dct_imagehash的函数时,编译器会抛出此错误:

/usr/include/CImg.h:72:18: fatal error: cstdio: No such file or directory
compilation terminated.

此时我意识到pHash是用C ++编写的,因此在C程序中包含C ++标头是行不通的。尽管如此,函数本身似乎应该可以从C调用,因为它没有参数,也没有返回值使用C ++结构。有没有什么好方法可以从C调用C ++函数ph_dct_imagehash?

注意:我主要是为了在C(而不是C ++)上做得更好。这就是我将自己限制在C的原因。

3 个答案:

答案 0 :(得分:5)

只要您有一个未编码的符号名称,就可以非常轻松地将C ++库与C程序链接起来。你需要制作一个C安全头文件或其他方式来转发声明函数名,然后在最后将事物链接在一起(确保使用一个C ++感知链接器!)。

这是一个简单的例子:

$ cat cplusplus.cpp 
#include <string>

extern "C"
const char *cplusplusFunction(void)
{
    static std::string a = "Hello, C++";
    return a.c_str();
}
$ cat example.c 
#include <stdio.h>

const char *cplusplusFunction(void);

int main(void)
{
    printf("%s\n", cplusplusFunction());
    return 0;
}
$ c++ -c -o cplusplus.o cplusplus.cpp
$ cc -c -o example.o example.c 
$c++ -o example example.o cplusplus.o
$ ./example 
Hello, C++

答案 1 :(得分:2)

您需要将C ++代码函数与C代码分开。

通常,这是通过使.h文件仅包含解决问题所需的函数和C数据结构的C(非C ++)声明以及包含C到C ++接口函数的C ++文件来完成的。

您还需要使用

#ifdef __cplusplus
extern "C" {
#endif
.... your types and functions ... 
#ifdef __cplusplus
}
#endif

在头文件中,以确保C ++编译器不会“破坏”名称(标记函数名称中的参数类型,例如函数Blur(int x,int y)可以称为_Blur_ii ,常规C不会在函数名称上添加这种“额外的东西”,因此C编译器将调用_Blur - 当然,当你尝试链接时,链接器会说“找不到_Blur” 。

编辑:此外,绝对100%确保您没有“泄漏”到C代码中的异常。如果你这样做,任何事情都可能发生,而且通常不是金子从天而降,而是一些不好的东西...... :)

答案 2 :(得分:0)

如果您使用C ++编译器(比如g ++而不是gcc),您可以无缝地从C代码调用C ++代码,一切都会正常工作。 情况就是这样,因为除非你做的事情很奇怪,否则C包含在C ++中。

如果使用g ++编译时仍然无效,则应将文件后缀从.c更改为.cc,.cpp,.cxx等。最好.cc