我正在修补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的原因。
答案 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