我使用GCC 4.7.3编译和链接第三方库。我尝试了解触发未定义符号错误的原因:
Undefined symbols for architecture x86_64:
"void MyObject::myFunction<....>(...) const", referenced from:
void NameSpace::AnotherFunction<some_particular_arguments>(...) in some_source.cc.o
NameSpace::AnotherFunction
显然位于some_source.cc
,但是我可以从编译器/链接器获取一些关于使用some_particular_arguments
实例化此函数的信息吗?
使用CMake完成构建,并且NameSpace_AnotherFunction.inst
具有相应函数的模板实例化,但是这个特定的模板参数集不存在。
显然some_source.cc
没有实例化,否则我不会问;)
因此,我想知道是否有办法获取函数AnotherFunction
的特定模板参数列表中的实例化点(或类似)之类的信息?
答案 0 :(得分:1)
首先使用-g标志进行编译,以获取包含每个符号的源文件和行号信息的目标文件。然后在目标文件上使用带有-C和-l选项的nm命令打印出符号信息,为AnotherFunction打印。这应该给你行号。
编辑:既然我有机会尝试这一点,我认为它不会解决@Denis的问题。不幸的是,给定的行是定义函数模板的行,而不是实例化它的行。无论如何,在这里留下这个答案,以防它对其他人有用......
答案 1 :(得分:0)
一种实现方法是在依赖于模板类型的代码中导致编译器错误(或更佳的警告)(因此,仅在实际实例化模板时才会发出该错误)。
您可以尝试做类似的事情
,使其更具针对性if constexpr (std::is_same_v<T, some_particular_argument>())
// code emitting warning