静态变量链接错误


72

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

架构i386的未定义符号:“ Log :: theString”,引用自:libTest.a(Log.o)ld中的Log :: method(std :: string)ld:找不到架构i386铛的符号:错误:链接器命令失败,退出代码为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; 
}

我以这种方式从测试代码中调用“方法”:“ Log :: method(“ asd”):'

谢谢你的帮助。

Answers:


93

您必须在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无论您在何处包含标头,都会污染全局名称空间。


而是初始化而不是定义,不(只是问)?
Vyktor

9
也许更好的说法是它为字符串分配空间。
btown 2012年

非常感谢。你帮了我很多忙!
JavaRunner 2014年

1
关于using namespace *;标题的要点。如果您早些摆脱习惯,会更容易。
Benjineer 2014年

1
只需放入using namespace std;您自己的名称空间声明:Pnamespace your_custom_namespace { using namespace std; }
Pellet 2016年

21

您声明了static string theString;,但尚未定义。

包括

string Log::theString;

到你的cpp文件


2

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.