【发布时间】: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<Function*, DenseMap<Instruction*,Invariant*> > 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?还是一个单独的程序试图使用这个?