Проблема 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);

и в основном файле я использую внешний ключевое слово, чтобы сказать компилятору Foo :: вызов уже создан, поэтому нет необходимости снова его компилировать:

// 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;
}

Я тестирую программу с г ++ а также КОМП ++ с помощью НКУ-4,9.
За г ++ когда я прохожу 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

но когда я собираю с КОМП ++ (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 и поведение такое же, как г ++. Так что вопрос в том, почему MPICH игнорирует внешний и снова компилирует экземпляр.

Спасибо,

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]