未定义的对显式实例化模板函数的引用

时间:2018-10-18 22:59:15

标签: c++ templates g++ clang++ explicit-instantiation

我有一个带有模板方法的类,该方法在标头中声明并在cpp文件中定义,所以

// A.h - declaration
struct A
{
    template<typename T = int> void fun();
};

然后

// A.cpp - definition
#include <iostream>
#include "A.h"

template<typename T> void A::fun()
{
    std::cout << "Hello world template" << std::endl;
}

// Explicit instantiation
template void A::fun<int>();

现在,在其他地方,在测试中,我已经

#include "A.h"

int main ()
{
    A a;
    a.fun();
}

并且由于我显式实例化了int模板参数的函数,因此一切都很好。或者应该是!

我的代码可以与GCC 7.3.0很好地链接,但是不能与clang 6链接,clang 6报告了对函数fun的未定义引用。

这是怎么回事?还有什么我需要照顾的吗?也许GCC将clang视为理所当然的事情?

谢谢!

修改

@ WhozCraig,@ Neil Butterworth是这两个工具链的链接命令。

海湾合作委员会:

/usr/bin/g++  -g   CMakeFiles/test_generator.dir/generator/generator.cpp.o CMakeFiles/test_generator.dir/test_utils.cpp.o  -o test_generator -Wl,-rpath,/home/mleoni/PhD/ABI/libcellml/build/src:/home/mleoni/PhD/ABI/libcellml/build/tests/gtest ../src/libcellmld.so.0.1.0 gtest/libgtest_main.so /usr/lib/x86_64-linux-gnu/libxml2.so gtest/libgtest.so -lpthread

c语:

/usr/bin/clang++  -g   CMakeFiles/test_generator.dir/generator/generator.cpp.o CMakeFiles/test_generator.dir/test_utils.cpp.o  -o test_generator -Wl,-rpath,/home/mleoni/PhD/ABI/libcellml/build/src:/home/mleoni/PhD/ABI/libcellml/build/tests/gtest ../src/libcellmld.so.0.1.0 gtest/libgtest_main.so /usr/lib/x86_64-linux-gnu/libxml2.so gtest/libgtest.so -lpthread

@IdeaHat:不幸的是,这并没有解决问题,我仍然遇到相同的错误

编辑2 由于我实际上要编译的代码不是(显然)不是那个代码,因此我尝试编译此MWE,并且GCC和clang都只用cc A.cpp main.cpp就可以了。

我现在正试图了解这种最小情况与我实际拥有的代码之间的区别。

1 个答案:

答案 0 :(得分:0)

我找到了。在此代码库中的某个地方,我不熟悉所有类,默认情况下它们都标记为私有(如在Windows D:中一样),并且在标记了类之后,公共clang最终可以正确链接。

现在该图变厚了,因为使用clang编译的二进制文件,我看到测试套件中有很多段错误,而使用GCC编译时这些段错误不存在。

此外,现在我与该线程中的问题相同,除了现在,GCC和clang可以正常工作,而MSVC说unresolved external symbol:'(。