Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用extern时出错";";在c+中包含标题+;程序_C++_C_Extern - Fatal编程技术网

C++ 使用extern时出错";";在c+中包含标题+;程序

C++ 使用extern时出错";";在c+中包含标题+;程序,c++,c,extern,C++,C,Extern,我正在做一个学校的项目,需要合作。Sheepdog提供了一个c api,使您能够连接到Sheepdog服务器。 首先,我创建具有以下内容的c源文件(test.c): #include "sheepdog/sheepdog.h" #include <stdio.h> int main() { struct sd_cluster *c = sd_connect("192.168.1.104:7000"); if (!c) { fprintf(stderr, "failed to

我正在做一个学校的项目,需要合作。Sheepdog提供了一个c api,使您能够连接到Sheepdog服务器。 首先,我创建具有以下内容的c源文件(test.c):

#include "sheepdog/sheepdog.h"
#include <stdio.h>
int main()
{
struct sd_cluster *c = sd_connect("192.168.1.104:7000");
if (!c) {
    fprintf(stderr, "failed to connect %m\n");
    return -1;
}else{
    fprintf(stderr, "connected successfully %m\n");
}
    return 0;
}
extern "C"{
#include "sheepdog/sheepdog.h"
}
#include <stdio.h>
int main()
{
    struct sd_cluster *c = sd_connect("192.168.1.104:7000");
    if (!c) {
       fprintf(stderr, "failed to connect %m\n");
       return -1;
    }else{
       fprintf(stderr, "connected successfully %m\n");
    }
    return 0;
}
#包括“sheepdog/sheepdog.h”
#包括
int main()
{
struct sd_cluster*c=sd_connect(“192.168.1.104:7000”);
如果(!c){
fprintf(stderr,“无法连接%m\n”);
返回-1;
}否则{
fprintf(stderr,“已成功连接%m\n”);
}
返回0;
}
然后使用以下命令编译,没有错误

gcc-o测试test.c-lsheeplog-lpthread

<>但是我需要用C++项目来使用它,所以我创建了一个CPP文件(test .CPP),内容如下:

#include "sheepdog/sheepdog.h"
#include <stdio.h>
int main()
{
struct sd_cluster *c = sd_connect("192.168.1.104:7000");
if (!c) {
    fprintf(stderr, "failed to connect %m\n");
    return -1;
}else{
    fprintf(stderr, "connected successfully %m\n");
}
    return 0;
}
extern "C"{
#include "sheepdog/sheepdog.h"
}
#include <stdio.h>
int main()
{
    struct sd_cluster *c = sd_connect("192.168.1.104:7000");
    if (!c) {
       fprintf(stderr, "failed to connect %m\n");
       return -1;
    }else{
       fprintf(stderr, "connected successfully %m\n");
    }
    return 0;
}
extern“C”{
#包括“牧羊犬/牧羊犬.h”
}
#包括
int main()
{
struct sd_cluster*c=sd_connect(“192.168.1.104:7000”);
如果(!c){
fprintf(stderr,“无法连接%m\n”);
返回-1;
}否则{
fprintf(stderr,“已成功连接%m\n”);
}
返回0;
}
现在,当我使用以下命令编译时:

g++-o test.cpp-lsheepdog-lpthread


我得到这个错误:

你不能只在一个头上包上<代码>外“C”<代码>,并希望它在C++程序中编译。例如,标题
sheepdog_proto.h
使用名为
new
的参数;这是C++中的关键字,所以没有办法编译成C++。图书馆不是设计为C++的。

< P>我同意@ PeteBecker。快速浏览一下谷歌,我不确定是否有一个简单的解决方案。牧羊犬使用C特征和名称,它们不能很好地移植到C++。你可能需要相当广泛地攻击牧羊犬。例如:

  • inline
    函数从
    sheepdog_proto.h
    移到新的C文件中,保留原型。这应该考虑到错误的
    偏移量,例如中讨论的
    
  • #在
    sheepdog/sheepdog.h

以及为了使其编译而必须进行的任何其他特定更改。由于专家没有设计出可用于C++的程序,所以你应该用C语言来构建一个小包装器来调用牧羊犬的函数,并且只从C++代码中调用包装器。编写此类包装器的一些提示:

  • void*
    传递不透明指针非常好
  • 提取器可以帮助访问名称不正确的成员。如果结构有一个名为
    new
    (类型为T)的成员,则可以编写:

    T getNew(void *otherstruct); // declaration in .h
    

取决于牧羊犬的复杂性(我不知道)和您想要使用的部件,它可能是一个可接受的解决方案,也可能不是。但这是我面对这样一个问题的方式


无论如何,链接器允许在C和C++中编译混合模块,无论是静态链接还是动态链接。

用G++-O测试程序。CPP -L/绝对伏特加/路径/ to/牧羊犬-lpthread@Phiber对于露齿而笑的人也有同样的问题,您是否先在没有外部“C”
的情况下尝试过?是
牧羊犬/sheepdog.h
?(我在GitHub中的
include/
下没有看到
sheepdog/sheepdog.h
)您似乎也有include头的问题,尝试使用:g++-I/sheepdog/headers或设置CPLUS_INCLUDE_PATH envvariable@cxw是的,我试过了,同样的错误happened@PeteBecker如果我在C++中使用C++创建这个库,它提供了我在C++程序中需要的函数,然后将它与我的C++程序连接起来。这个工作<代码>定义新的…<代码>产生未定义的。彼得·贝克尔在这种情况下的行为?对于牧羊犬,我认为
new
只是一个像其他标识符一样容易被重新定义的标识符。Sheepdog没有对
操作符new
的调用,因此编译器没有理由专门处理名为
foo_new
的东西。我错过什么了吗?--我还发现了一个模糊相关的问题:).cxw——用宏重新定义任何C++关键字会产生未定义的行为。这可能是无害的,但这并不能改变它的本质。对于这篇文章的未来读者-