【问题标题】:need to find out where the function is instantiated (gcc 4.7)需要找出函数在哪里实例化(gcc 4.7)
【发布时间】:2013-12-16 10:23:44
【问题描述】:

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

【问题讨论】:

  • 在文件中查找?,如果使用该函数的实例在可见代码中,这将起作用。如果它在需要另一个库的库上,那么您需要一些库检查工具来查找对它的引用。
  • “架构 x86_64 的未定义符号”看起来像识别不受支持的架构的链接器消息。可能是您提供的模板参数不适用于 x86_64?
  • @Raxvan 我试图在文件中找到它,但没有看到它。该函数是库的函数,不需要另一个函数。
  • @ValentinHeinitz 我会说 MyObject::MyFunction 确实没有针对特定参数进行实例化。但是,我试图找出父函数在哪里实例化(使用那些模板参数),并认为可能有一些工具/命令行选项来促进它

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    您可以尝试通过执行类似的操作来使其更加专注

    if constexpr (std::is_same_v<T, some_particular_argument>())
        // code emitting warning
    

    【讨论】:

      猜你喜欢
      • 2013-01-02
      • 2012-05-04
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多