静态变量链接错误

时间:2012-02-14 18:42:02

标签: c++ xcode static-libraries clang static-methods

我在mac上编写C ++代码。编译时为什么会出现此错误?:

  

架构i386的未定义符号:“Log :: theString”,   引自:         libTest.a中的Log :: method(std :: string)(Log.o)ld:找不到架构i386 clang的符号:错误:链接器命令失败   退出代码1(使用-v查看调用)

不确定我的代码是否错误或者我必须向Xcode添加其他标志。我当前的XCode配置是“静态库”项目的默认配置。

我的代码:

Log.h ------------

#include <iostream>
#include <string>

using namespace std;

class Log{
public:
    static void method(string arg);
private:
    static string theString ;
};

Log.cpp ----

#include "Log.h"
#include <ostream>

void Log::method(string arg){
    theString = "hola";
    cout   << theString << endl; 
}

我从测试代码中调用'方法',这样: “登录::方法( ”ASD“):

感谢您的帮助。

3 个答案:

答案 0 :(得分:79)

您必须在cpp文件中定义静态。

Log.cpp

#include "Log.h"
#include <ostream>

string Log::theString;  // <---- define static here

void Log::method(string arg){
    theString = "hola";
    cout   << theString << endl; 
}

您还应该从标题中删除using namespace std;。在你还可以的时候养成这个习惯。无论您何时包含标题,都会使用std污染全局命名空间。

答案 1 :(得分:16)

您声明了static string theString;,但尚未对其进行定义。

包含

string Log::theString;

到您的cpp文件

答案 2 :(得分:2)

在C ++ 17中,有一个使用inline变量的简单解决方案:

class Log{
public:
    static void method(string arg);
private:
    inline static string theString;
};

这是一个定义,不仅仅是一个声明,并且类似于inline函数,不同翻译单元中的多个相同定义不会违反ODR。不再需要为该定义选择一个喜欢的.cpp文件。