我有一个带有模板方法的类,该方法在标头中声明并在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
就可以了。
我现在正试图了解这种最小情况与我实际拥有的代码之间的区别。
答案 0 :(得分:0)
我找到了。在此代码库中的某个地方,我不熟悉所有类,默认情况下它们都标记为私有(如在Windows D:中一样),并且在标记了类之后,公共clang最终可以正确链接。
现在该图变厚了,因为使用clang编译的二进制文件,我看到测试套件中有很多段错误,而使用GCC编译时这些段错误不存在。
此外,现在我与该线程中的问题相同,除了现在,GCC和clang可以正常工作,而MSVC说unresolved external symbol
:'(。