C++ 为什么“cplusplus在外部定义”;";
在externC++ 为什么“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
“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> >告诉编译器如何导出符号()而
如果头不能由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