我对C ++命名空间以及如何定义它们有点困惑。我有两个文件:Lua.h
和Main.cpp
。 Lua.h
包含以下用于在命名空间中运行Lua脚本的帮助程序:
#ifndef Lua_h
#define Lua_h
#include <lua.hpp>
namespace fabric
{
namespace lua
{
void loadLibs(lua_State * L)
{
static const luaL_Reg luaLibs[] =
{
{ "io", luaopen_io },
{ "base", luaopen_base },
{ NULL, NULL }
};
const luaL_Reg * lib = luaLibs;
for (; lib->func != NULL; lib++)
{
lib->func(L);
lua_settop(L, 0);
}
}
void init(lua_State * L)
{
loadLibs(L);
luaL_dofile(L, "Init.lua");
lua_close(L);
}
}
}
#endif
我的Main.cpp
文件尝试使用这些辅助函数运行Lua脚本:
#include "Lua.h"
int main (int argc, char * argv[])
{
fabric::lua::init();
return 0;
}
但是当我尝试编译Main.cpp
时,我得到了这个:
Source/Main.cpp:9:3: error: use of undeclared identifier 'fabric'
fabric::lua::init();
^
我对如何定义此命名空间感到困惑。辅助函数的代码都很好,但Main.cpp
找不到命名空间。任何人都可以给我一些关于如何在C ++中正确定义这个命名空间的指针吗?
修改:
立即行动。出于某种原因,我的-I
标志在编译时没有工作,因为我的标题在Include/
下。我还将Lua.h
重命名为LuaHelpers.h
。
答案 0 :(得分:1)
我猜你的Lua.h和Lua的Lua.h之间存在冲突。考虑将文件重命名为fabric.h或类似的东西。
也就是说,当文件包含在两个翻译单元中时,将非内联函数放入头文件会导致链接器错误。考虑将代码拆分为典型的头/实现对。
答案 1 :(得分:1)
也许原因是,Lua库也有文件,而且你正在使用Windows,所以文件系统不区分大小写?
lua.hpp
// lua.hpp
// Lua header files for C++
// <<extern "C">> not supplied automatically because Lua also compiles as C++
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}