c++ - Scripting::LState 的多重定义

标签 c++

以下代码无法编译。 链接器输出此错误:'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/

相关文章:

c++ - 我可以使用 C++ 在 EXE 文件中找到资源的偏移量吗?

c++ - 在 omnet++ IDE 中找不到 -lC :\SQLAPI\lib\sqlapi. 库

C++:是否有任何理由使用 uint64_t 而不是 size_t

c++ - GetGlyphOutline 函数如何工作? (WinAPI)

c++ - 为什么我不能使用模板模板参数将 std::vector<MyType> 传递给此函数?

c++ - 您应该将自动拷贝 move 到成员中还是保留它?

java - 将数组作为指针+大小或范围传递给包装的函数

C++ 强制转换语法样式

c++ - CUDA gridDim、blockDim 总是用户定义的吗?

c++ - 如何在 Windows 上的 cuda 推力调用中指定 OpenMP 执行策略?