我用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
?
首先使用 -g 标志进行编译,以获得包含源文件和每个符号的行号信息的目标文件。然后在目标文件上使用带有 -C 和 -l 选项的 nm 命令来打印符号信息,grep for AnotherFunction。这应该会给你行号。
编辑:现在我有机会尝试一下,我认为它不能解决@Denis的问题。不幸的是,给出的行是定义函数模板的行,而不是实例化函数模板的行。无论如何,将这个答案留在这里,以防对其他人有用......
一种方法是在依赖于模板类型的代码中引发编译器错误(或者更好的是警告)(因此仅在模板实际实例化时发出)。
您可以尝试通过做类似的事情来使其更加集中
if constexpr (std::is_same_v<T, some_particular_argument>())
// code emitting warning