关于c调用lua 对‘luaL_newstate()’未定义的引用的问题解决办法
2017-08-08 19:37
579 查看
#include <string.h>#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
int main(int argc, char *argv[])
{
char buff[256];
int error;
lua_State *L = luaL_newstate();
luaL_openlibs(L);
while (fgets(buff, sizeof(buff), stdin) != NULL) {
error = luaL_loadbuffer(L, buff, strlen(buff),
"line") || lua_pcall(L, 0, 0, 0);
if (error) {
fprintf(stderr, "%s", lua_tostring(L, -1));
lua_pop(L, 1);/* pop error message from the stack */
}
}
lua_close(L);
return 0;
}
最近学习lua脚本,编译上面程序一直如下错误 用g++ a.cpp -o a -llua -ldl
[root@localhost lua+c]# g++ a.cpp -o a -llua -ldl
a.cpp:8: 警告:不建议使用从字符串常量到‘char*’的转换
/tmp/ccij5HeF.o:在函数‘main’中:
a.cpp:(.text+0xe):对‘luaL_newstate()’未定义的引用
a.cpp:(.text+0x24):对‘luaL_openlibs(lua_State*)’未定义的引用
a.cpp:(.text+0x60):对‘luaL_loadbufferx(lua_State*, char const*, unsigned int, char const*, char const*)’未定义的引用
a.cpp:(.text+0x9b):对‘lua_pcallk(lua_State*, int, int, int, int, int (*)(lua_State*, int, int))’未定义的引用
a.cpp:(.text+0xe4):对‘lua_tolstring(lua_State*, int, unsigned int*)’未定义的引用
a.cpp:(.text+0x107):对‘lua_settop(lua_State*, int)’未定义的引用
a.cpp:(.text+0x140):对‘lua_close(lua_State*)’未定义的引用
网上查的说法都是库没有链接成功,折腾了好久,最后在http://blog.csdn.NET/zuijinbuzai/article/details/7385380中找到了答案,
原来是因为lua是C语言模块,用g++调用c语言的库需要在包含头文件时加上extern "C",就能正常编译了,即修改为
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
};
#include <string.h>
int main(int argc, char *argv[])
{
char buff[256];
int error;
lua_State *L = luaL_newstate();
luaL_openlibs(L);
while (fgets(buff, sizeof(buff), stdin) != NULL) {
error = luaL_loadbuffer(L, buff, strlen(buff),
"line") || lua_pcall(L, 0, 0, 0);
if (error) {
fprintf(stderr, "%s", lua_tostring(L, -1));
lua_pop(L, 1);/* pop error message from the stack */
}
}
lua_close(L);
return 0;
}
#include "lauxlib.h"
#include "lualib.h"
int main(int argc, char *argv[])
{
char buff[256];
int error;
lua_State *L = luaL_newstate();
luaL_openlibs(L);
while (fgets(buff, sizeof(buff), stdin) != NULL) {
error = luaL_loadbuffer(L, buff, strlen(buff),
"line") || lua_pcall(L, 0, 0, 0);
if (error) {
fprintf(stderr, "%s", lua_tostring(L, -1));
lua_pop(L, 1);/* pop error message from the stack */
}
}
lua_close(L);
return 0;
}
最近学习lua脚本,编译上面程序一直如下错误 用g++ a.cpp -o a -llua -ldl
[root@localhost lua+c]# g++ a.cpp -o a -llua -ldl
a.cpp:8: 警告:不建议使用从字符串常量到‘char*’的转换
/tmp/ccij5HeF.o:在函数‘main’中:
a.cpp:(.text+0xe):对‘luaL_newstate()’未定义的引用
a.cpp:(.text+0x24):对‘luaL_openlibs(lua_State*)’未定义的引用
a.cpp:(.text+0x60):对‘luaL_loadbufferx(lua_State*, char const*, unsigned int, char const*, char const*)’未定义的引用
a.cpp:(.text+0x9b):对‘lua_pcallk(lua_State*, int, int, int, int, int (*)(lua_State*, int, int))’未定义的引用
a.cpp:(.text+0xe4):对‘lua_tolstring(lua_State*, int, unsigned int*)’未定义的引用
a.cpp:(.text+0x107):对‘lua_settop(lua_State*, int)’未定义的引用
a.cpp:(.text+0x140):对‘lua_close(lua_State*)’未定义的引用
网上查的说法都是库没有链接成功,折腾了好久,最后在http://blog.csdn.NET/zuijinbuzai/article/details/7385380中找到了答案,
原来是因为lua是C语言模块,用g++调用c语言的库需要在包含头文件时加上extern "C",就能正常编译了,即修改为
extern "C" {
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
};
#include <string.h>
int main(int argc, char *argv[])
{
char buff[256];
int error;
lua_State *L = luaL_newstate();
luaL_openlibs(L);
while (fgets(buff, sizeof(buff), stdin) != NULL) {
error = luaL_loadbuffer(L, buff, strlen(buff),
"line") || lua_pcall(L, 0, 0, 0);
if (error) {
fprintf(stderr, "%s", lua_tostring(L, -1));
lua_pop(L, 1);/* pop error message from the stack */
}
}
lua_close(L);
return 0;
}
相关文章推荐
- 关于c调用lua 对‘luaL_newstate()’未定义的引用的问题解决办法
- 关于QComboBox调用clear()崩溃的问题和解决办法
- 关于LitePal定义List存不进去的问题的解决办法
- 关于调用startActivityForResult()方法后Activity直接退出的问题原因和解决办法
- 关于Azure HDInsight资源调用的问题及解决办法
- 关于JAVA调用Matlab遇到的问题+JDK重装后原有项目报错的解决办法
- 关于Bootstrap弹出框无法调用问题的解决办法
- 调用可能未定义的方法 attachVideo (通过 static 类型 flash.media:Video 引用)解决办法
- CS0012: 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义----问题解决办法
- 关于实现引用类型数组去调用引用类的方法的问题的解决
- CS0012: 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义----问题解决办法
- 关于DllRegisterServer的调用失败的问题解决办法
- CS0012: 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义----问题解决办法
- 关于Bootstrap弹出框无法调用问题的解决办法
- 关于 未能加载文件或程序集“”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 的解决办法
- 关于调用线程无法访问此对象,因为另一个线程拥有该对象的问题的解决办法
- 关于DllRegisterServer的调用失败的问题解决办法 错误代码0x80040201
- 关于AJAX调用ASP.NET MVC 或者WEBAPI项目提示I跨域问题的解决办法
- 关于Powerbuilder调用VC的dll出现的一个问题及解决办法
- 关于多文件引用头文件变量重复定义的解决办法【BCB2010环境】