【问题标题】:g++ removes useless function? Undefined referenceg ++删除无用功能?未定义参考
【发布时间】:2013-11-25 09:59:25
【问题描述】:

我有带有声明的 hpp 文件:

namespace X {
    class Y {
        public:
          [other functions]

          inline float basicFunction();
          int someFunction();

        [other functions]
    };
}

在cpp文件中:

namespace X { 
    [implementations etc.]

    inline float Y::basicFunction() {
        return someValue * someMath / moreMath;
    }

    int Y::someFunction() {
        return basicFunction() * 100;
    }

    [other functions]
}

我在其他 cpp 文件中使用它,但我认为这不是问题。编译:

g++ -c someclass.cpp -o someclass.o -std=c++11
g++ -c main.cpp -o main.o -std=c++11
g++ main.o someclass.o -o main -std=c++11 -O0

抛出错误:

main.o: In function `main':
    main.cpp:(.text+0x4d9): undefined reference to `X::Y::someFunction()'

为什么?我怎样才能正确编译它?
我知道someFunction() 没用,但这被多次调用,我就是喜欢这种方式。

上面的所有代码都不是真实的,所以可能有错误,但在我的程序上它(我认为)是正确的

我尝试了很多组合(两个函数具有相同的返回类型,都内联,没有内联等)但没有效果。

【问题讨论】:

  • 为什么Y::basicFunction() 在您的 CPP 文件中内联?
  • main中的调用代码是什么样的?
  • 你真正的编译命令输出someclass.omain.o,而不是someclassmain
  • 为了记录,我们真的不在乎代码是否真实,只要它 (a) 编译,并且 (b) 重现问题
  • @WhozCraig - 这必须仅在 HPP 中内联声明?没关系,现在我删除了内联,问题仍然存在。帖子中的代码无法编译,原因很明显;) @ChrisMantle - 只是创建对象 X::Y objobj.function() @MikeSeymour - 是的(见编辑)

标签: c++ g++ makefile ld


【解决方案1】:

解决了。函数不能内联。

仍然不知道为什么它在删除内联后尝试了一些但没关系。

解释为什么这段代码中的函数不能内联很简单。编译器,当看到“内联”时,不要创建指向函数的指针,而是将代码粘贴到引用的位置。

只是我的错...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多