Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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++ 为什么“cplusplus在外部定义”;";_C++_C_Mpi - Fatal编程技术网

C++ 为什么“cplusplus在外部定义”;";

C++ 为什么“cplusplus在外部定义”;";,c++,c,mpi,C++,C,Mpi,在extern“C”{}中,宏\uuucplusplus仍然是定义的。当我想在我的库的头中动态加载C++的代码< MPI.H./C>时,它将不能工作为 MPI。h < /C> >仍然找到 #undef uu cplusplus与gcc一起工作。但我不想依赖这一点 如何编写C++程序 -使用MPI的C++版本 -链接到使用mpi C版本的C库(其中,#include已出现在标题中) 示例代码: 图书馆h: #ifdef __cplusplus extern "C" { #endif #incl

在extern
“C”{}
中,宏
\uuucplusplus
仍然是定义的。当我想在我的库的头中动态加载C++的代码< <代码> MPI.H./C>时,它将不能工作为<代码> MPI。h < /C> >仍然找到<代码>
#undef uu cplusplus
与gcc一起工作。但我不想依赖这一点

如何编写C++程序 -使用MPI的C++版本 -链接到使用mpi C版本的C库(其中,
#include
已出现在标题中)

示例代码:

图书馆h:

#ifdef __cplusplus
extern "C" {
#endif

#include <mpi.h>

void library_do(MPI_Comm comm);

#ifdef __cplusplus
}
#endif

如果编译器是C++编译器,则P> >代码> CPLUS PLUS >代码>。<代码>外部“C”{} /代码>只给C链接,所以内部代码与C编译器很好。

,因为它们是不同的东西。<代码>外“C”{} /COD> >告诉编译器如何导出符号()而 > CypUsPLUS 告诉您,可以使用C++代码,以便您的库可以在代码< > IFIFEF < /COS> S.< /P> < P>之间使用不同的代码路径。当然,它是定义的。它仍然是在<代码>外部“C”中编译代码的C++编译器。

如果头不能由C++编译器编译,唯一的解决办法是创建一个强的> c>强>包装器,它公开了一个C++兼容的API。

使用

的点
#ifdef __cplusplus
extern "C" {
#endif

...

#ifdef __cplusplus
}
#endif

是防止C++中的名字被篡改。我们基本上说不要像传统C++函数调用那样使用名字来代替它,而是让它不被修饰。 这个链接可能有用

用于使C标题与C++兼容。


在C++编译器中自动定义了标志<代码>·ycpUsPLux//Cuff.< > p> < p>如果C++中的代码>包含< /代码>,不要把“代码>外部”C“/CODE”放在它周围。至少OpenMPi和英特尔MPI在头本身中这样做——如果<代码> 你可能会遇到麻烦,因为一些MPI实现仍然定义了C++中的C++接口,它是从标准中删除的。有效,但我还是不推荐它

更新:如果您无法修改库标题,只需在
#include
之前添加
#include


上述的MPI,不应使用C++绑定。它们是6年前的标准强< >删除< /强>,在3年后…< /P> < P>编译器输出以下内容:

在/usr/include/c++/4.8.2/bits/stl_algobase.h:61:0中包含的文件中,
从/usr/include/c++/4.8.2/bits/stl_tree.h:61,
从/usr/include/c++/4.8.2/map:60,
从/usr/include/openmpi-x86_64/openmpi/ompi/mpi/cxx/mpicxx.h:38,
从/usr/include/openmpi-x86_64/mpi.h:2674,
从x1.cpp:6:
/usr/include/c++/4.8.2/bits/cpp_type_traits.h:72:3:错误:带有c链接的模板
模板
^
/usr/include/c++/4.8.2/bits/cpp_type_traits.h:85:3:错误:带有c链接的模板
模板
^
...
MPI.H报头检测它是被编译为C++的,因此包含C++特定的特征。但是模板(除其他事项外)不适用于C链接(即如果头在<代码>外部)C“< /代码>块”。 将包含移动到外部“C”上方:

#包括
#ifdef_uucplusplus
外部“C”{
#恩迪夫
无效库(MPI通信);
#ifdef_uucplusplus
}
#恩迪夫

当编译编译单元为C++代码时,定义了代码>不编译内部代码,因为Cy.CPLUS是一个宏。它由预处理器定义和使用。预处理器对卷轴或C++关键词一无所知。因此,无论您期望的是什么,都是根本不可能的。问题是XY问题的一个最好例子。您没有包含任何代码或错误消息。得到四个正确答案回答你的问题,但可能不是你的问题。请你的问题使它更有用,避免任何进一步的问题。这将不工作,如<代码> MPI。h < /C++ >仍然发现<代码>时间,你没有在C代码中自己定义它,这个库是由C++代码打开的。<代码>“Ung/Buffeld:@ SouBrReGuang-st链接在UB中产生。你是否使用C编译器玩得好?”Bathsheba只在星期天。我认为它不是一个重要的C++编译器,而是它是否是C++编译(即<代码> CPP < /Cord>文件)。。问题仍然存在于加载cpp库的实际程序中,该库再次依赖于使用mpi的C库。错误为
libbla_plugin。因此:未定义的符号:_zn3mpi3win4freev
最终也找到了错误:我在cmake的cpp库中链接了mpi库的C版本。
#include <stdio.h>
#include "library.h"

void library_do(MPI_Comm comm)
{
    int rank;
    MPI_Comm_rank(comm, &rank);
    printf("MPI Rank: %d", rank);
}
#ifdef __cplusplus
extern "C" {
#endif

...

#ifdef __cplusplus
}
#endif
#include <mpi.h>

#ifdef __cplusplus
extern "C" {
#endif

void library_do(MPI_Comm comm);

#ifdef __cplusplus
}
#endif