2016-12-29 13 views
1

我正在学习使用Lua嵌入到我的C程序中。我想知道他们最好的办法是确保我的C程序可以在构建完成后找到Lua文件。我试图确保这可以与源代码CMake构建一起使用。包装Lua脚本文件的最佳做法是从C中调用。使用CMake

这是我到目前为止。

在我的C文件,我有...

int runLuaHelloWorld() { 

    lua_State *L = luaL_newstate(); 
    luaL_openlibs(L); 
    luaL_dofile(L, "helloWorld.lua"); 
    lua_close(L); 

    return 0; 
} 

在我的CMakeLists.txt我有。

set(EMBEDDED_LUA_SRC embeddedLua.c embeddedLua.h) 
add_library(embeddedLua ${EMBEDDED_LUA_SRC}) 
if(LUA_FOUND) 
    target_include_directories(embeddedLua PRIVATE ${LUA_INCLUDE_DIR}) 
    target_link_libraries(embeddedLua ${LUA_LIBRARIES}) 
    add_custom_command(TARGET embeddedLua POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:embeddedLua> helloWorld.lua) 
endif() 

这成功地将它复制到我的编译目录中。但它似乎加载我的lua脚本文件相对于我当前的工作目录。换句话说,如果我从build文件夹运行脚本,我只能运行该脚本。

包含和运行外部lua文件发布后的最佳做法是什么?

也许我会以完全错误的方式去解决这个问题。也许这根本不是构建问题。 lua脚本需要相对于可执行文件运行(或者更好,相对于库),而不是运行在我的工作目录中。

有什么想法?

+0

大概[这是](https://stackoverflow.com/questions/16865040/luajit-compiling-bytecode-into-object-format)有史以来的最佳做法 –

+0

参见http://stackoverflow.com/questions/ 194520 /创建 - 独立 - 卢阿 - 可执行文件。 – lhf

+0

不打算创建独立的Lua可执行文件。我正在用C编写一个库,并希望包含一个使用Lua脚本与该库进行交互的应用程序。我想让编辑lua文件变得很容易,以便每次更改脚本时都不必重新编译整个库。 – loneraver

回答

2

在我们的软件中,我们定义了一个路径到一个目录,在这里我们存储了用Lua编写的扩展。然后我们使用opendir(),readir()等来查找那个目录中的文件,当它们以'.lua'结尾时,我们加载并执行它们。所以只需要将他们的脚本复制到该位置。

在一些应用程序中,我们甚至将Lua脚本存储在(PostgreSQL)数据库表的文本列中。

+0

好主意!这很奇妙。我唯一的问题是,我的Lua脚本没有在同一个文件夹中找到任何其他Lua模块。我主要在工作中编写Python,而我是Lua的新手,所以请和我一起袒护。我想我读过,我必须设置一个路径变量,让它知道在哪里寻找其他支持的Lua文件。这是正确的还是有更好的方法? – loneraver

+1

是的,这是正确的。您可以非常灵活地设置Lua将寻找模块的路径。实际上,如果你深入挖掘,你甚至有更多的选择来编写自己的模块加载器。有关详细信息,请查看lua_load周围的文档。 –

+0

太棒了!发布我的回复后,我想出了如何做到这一点。感谢您确认我在正确的轨道上。 – loneraver