В пределах extern "C" { }
макрос __cplusplus
все еще определен.Когда я хочу включить версию C mpi.h
в заголовок моей библиотеки, которая динамически загружается, это не будет работать, поскольку mpi.h
все еще находит __cplusplus
и все равно будет загружаться так, как это было открыто C ++.
#undef __cplusplus
работает с gcc.Но я не хочу на это полагаться.
Итак, как написать программу на C ++, которая - использует версию mpi на C ++ и - связана с библиотекой C, которая использует версию mpi на C (где#include <mpi.h>
появляется уже в заголовке?
Пример кода:
library.h:
#ifdef __cplusplus
extern "C" {
#endif
#include <mpi.h>
void library_do(MPI_Comm comm);
#ifdef __cplusplus
}
#endif
program.cpp:
#include <library.h>
#include <mpi.h>
int main() {
MPI::Init();
// do some mpi C++ calls...
library_do(MPI::COMM_WORLD);
MPI::Finalize();
}
В случае, если кто-то захочет воспроизвести пример здесь, library.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);
}
И скомпилировать все, что я пытаюсь с помощью
mpicc -shared library.c -o lib.so
mpicxx program.cpp -l lib.so