需要找出函数实例化的位置(gcc 4.7)

时间:2013-12-16 10:23:45

标签: c++ templates gcc compiler-construction linker

我使用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的特定模板参数列表中的实例化点(或类似)之类的信息?

2 个答案:

答案 0 :(得分:1)

首先使用-g标志进行编译,以获取包含每个符号的源文件和行号信息的目标文件。然后在目标文件上使用带有-C和-l选项的nm命令打印出符号信息,为AnotherFunction打印。这应该给你行号。

编辑:既然我有机会尝试这一点,我认为它不会解决@Denis的问题。不幸的是,给定的行是定义函数模板的行,而不是实例化它的行。无论如何,在这里留下这个答案,以防它对其他人有用......

答案 1 :(得分:0)

一种实现方法是在依赖于模板类型的代码中导致编译器错误(或更佳的警告)(因此,仅在实际实例化模板时才会发出该错误)。

您可以尝试做类似的事情

,使其更具针对性
if constexpr (std::is_same_v<T, some_particular_argument>())
    // code emitting warning