【问题标题】:variable has internal linkage but is not defined变量具有内部链接但未定义
【发布时间】:2013-04-08 04:35:57
【问题描述】:

我有这个 .h 文件:

namespace{

class Invariant{
public:
  Invariant(z3::expr e,Instruction *i):Expr(e),I(i){
    DenseMap<Instruction*,Invariant*> FunMap = Invariants[F];
  }

private:
  //static map
  static DenseMap<Function*, DenseMap<Instruction*,Invariant*> >Invariants;

};
}//end of anonymous namespace

当我编译 clang 时说:

Invariant.h:46:65: warning: variable '<anonymous namespace>::Invariant::Invariants' has internal linkage but is not defined
  static DenseMap<Function*, DenseMap<Instruction*,Invariant*> >Invariants;
                                                                ^
Invariant.h:26:48: note: used here
    DenseMap<Instruction*,Invariant*> FunMap = Invariants[F];

这里有什么问题?

【问题讨论】:

  • 你有一个静态类变量。它是否在任何地方为链接解析正确定义(加载的问题,因为您显示的消息使答案相当明显)。静态类成员需要在类内声明,然后在类外定义。您需要在此标头的关联 .cpp 文件中使用 static DenseMap&lt;Function*, DenseMap&lt;Instruction*,Invariant*&gt; &gt; Invariant::Invariants;
  • 如果我这样做,在链接阶段会出现:llvm[0]: Linking Debug+Asserts Loadable Module Acsl.so Error opening '/home/giacomo/llvmtmp/llvm-csfv/Debug+Asserts /lib/Acsl.so':/home/giacomo/llvmtmp/llvm-csfv/Debug+Asserts/lib/Acsl.so:未定义符号:_ZN12_GLOBAL__N_19Invariant10InvariantsE - 加载请求被忽略。
  • 我不认为当您从头文件中复制“静态”这个词时,您没有保留这个词,是吗?它应该在 .cpp 文件中声明为 static。我不好包括它。对此感到抱歉。
  • 是的,我删除了“静态”,但同样的错误
  • 我看到的唯一可能使事情变得更糟的是匿名命名空间。我几乎不承认他们在过渡单元中定义的行为(即使有这样的事情),但我也会尝试失去它。匿名命名空间对我来说就像希腊语(我从不使用它们)。此链接错误是否来自您正在构建的定义此类的.so?还是一个单独的程序试图使用这个?

标签: c++ linkage


【解决方案1】:

只要定义它。在类定义之后但在匿名命名空间结束之前添加这一行:

DenseMap<Function*, DenseMap<Instruction*,Invariant*> > Invariant::Invariants;

这将在包含此标头的每个翻译单元中创建静态成员(没关系,因为它位于匿名命名空间中,每个翻译单元都是唯一的)。这可能不是您想要的,但这是在匿名命名空间中定义 Invariant 之后的结果。如果你改用命名空间,你可以把Invariants的定义放到一个源文件中,所有代码只共享一个对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2016-08-25
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多