具有显式实例化的MPICH问题(忽略extern)

时间:2016-10-28 20:26:45

标签: c++ c++11 templates mpich mpic++

我使用显式实例化技术编写了一个简单的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;
}  

我使用 gcc-4.9 g ++ mpic ++ 测试程序。 对于 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 ),程序会编译哪个应该在未通过。

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 并再次编译实例化。

谢谢,

0 个答案:

没有答案