Проблема MPICH с явной реализацией (игнорирование extern)
Я написал простую программу на C++ с использованием техники явной реализации, как показано ниже:
// foo.hpp
#include <iostream>
struct foo
{
template <typename Arg>
static void call(Arg arg)
{
std::cout << "foo\n";
}
};
здесь у меня есть явная реализация класса foo:
// foo.cc
#include "foo.hpp"
template void foo::call(int);
и в основном файле я использую ключевое слово extern, чтобы сообщить компилятору, что вызов foo::call уже создан, поэтому нет необходимости снова его компилировать:
// main.cc
#include <iostream>
#include "foo.hpp"
extern template void foo::call(int);
int main(int argc, char const *argv[])
{
foo::call(1);
return 0;
}
Я тестирую программу с g ++ и mpiC++, используя gcc-4.9. Для g ++, когда я передаю foo.o, он работает нормально:
g++ -std=c++11 -c foo.cc
g++ -std=c++11 main.cc foo.o -o main
и когда я не передаю foo.o, он жалуется, как и ожидалось:
g++ -std=c++11 test_simple.cc -o test_simple
/tmp/ccclcKnc.o: In function `main':
test_simple.cc:(.text+0x15): undefined reference to `void foo::call<int>
(int)'
collect2: error: ld returned 1 exit status
но когда я компилирую с mpiC++ (MPICH) в обоих случаях (либо пропуская, либо не пропуская foo.o), программа компилирует, которая должна выдавать жалобу, если foo.o не пропущен.
mpic++ -std=c++11 -c foo.cc
mpic++ -std=c++11 main.cc foo.o -o main
или же
mpic++ -std=c++11 main.cc -o main // this line shouldn't compile but it does
Я протестировал код с OpenMPI и поведение такое же, как g ++. Поэтому вопрос в том, почему MPICH игнорирует extern и снова компилирует инстанцирование.
Спасибо,