以下代码无法编译。
链接器输出此错误:'Scripting::LState' 的多重定义;/tmp/RandomLetters.o:(.bss+0x0): 首先在这里定义
。
我将 GCC 7.3.1 与 GNU Binutils 2.31.1 一起使用,参数为:
gcc src/scripting/**.cc src/main.cc -llua -lstdc++
代码如下:
main.cc
#include "includes/scripting.hpp"
int main() {
Scripting::Init();
Scripting::Close();
}
includes/scripting.hpp
extern "C" {
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
#ifndef SCRIPTING_H
#define SCRIPTING_H
namespace Scripting {
lua_State *LState;
int Init();
int Close();
};
#endif
scripting/main.cc
#include "../includes/scripting.hpp"
int Scripting::Init() {
LState = luaL_newstate();
luaL_openlibs(LState);
luaL_loadstring(LState, "print('Hello World!');");
return 0;
}
int Scripting::Close() {
lua_close(LState);
return 0;
}
最佳答案
这是因为您在头文件中定义了一个变量。如果它包含在多个源文件中,则将它们链接在一起时会有多个定义。只需像这样在头文件中声明名称:
namespace Scripting {
extern lua_State *LState;
...
因此您只需声明变量并告诉编译器它存在于外部某处,因此他知道名称 LState。
然后在一个源文件中定义变量(你想为此使用 scripting/main.cc
,其中也定义了方法):
lua_State* Scripting::LState = nullptr; // Or some other value
关于c++ - Scripting::LState 的多重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52680424/