我有:
--main.lua
print("Hello from main.lua")
//main.c
#include <stdio.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
int main(int argc, char **argv)
{
int status;
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_getglobal(L, "require");
lua_pushliteral(L, "main");
status = lua_pcall(L, 1, 0, 0);
if (status) {
fprintf(stderr, "Error: %s\n", lua_tostring(L, -1));
return 1;
}
return 0;
}
#make.sh
luajit -b main.lua main.o
gcc -shared -O2 -fPIC -Wall -Wl,-E -o libmyluastuff.so main.o
gcc -O2 -Wall -Wl,-E -o out main.c -I/usr/include/luajit-2.0 -lluajit-5.1 -lm -ldl -L. -lmyluastuff
rm -r dist
mkdir dist
cp out libmyluastuff.so dist
cd dist
./out
如果我将luajit生成的对象链接到我的二进制文件中,它会按预期工作,但如果我将其链接为库(仍然可以通过-Wl,-E
导出),我会得到Error: module 'main' not found
我做错了什么?
修改
生成的可执行文件根本没有链接到库:
$ ldd out
linux-vdso.so.1 => (0x00007ffdfadf1000)
libluajit-5.1.so.2 => /usr/lib/x86_64-linux-gnu/libluajit-5.1.so.2 (0x00007f52099b0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f52095e6000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f52092de000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f52090da000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5208ec4000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5209c1f000)
我怀疑gcc只是将它优化掉了,因为main.c没有直接使用它的任何符号(但是如果它们被链接则会是libluajit)。我可以强迫它链接吗?