我在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“):
感谢您的帮助。
答案 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文件。