【发布时间】:2017-01-07 00:59:22
【问题描述】:
在阅读了大量 gcc 文档和类似问题后,我的问题仍然存在。
我试图将我的 libluajit.a 静态链接到我的项目中,但无论我尝试何种命令组合,都会弹出一个或另一个错误。不过,我已经使用动态链接成功编译了我的项目。
现在我没有想法,所以这是我现在得到的:
gcc_options = -std=c++11 -static -pthread
src_dir = LuaHost
src_files = $(src_dir)/*.cpp
src_files += $(src_dir)/*.h
src_files += $(src_dir)/LuaSrc/*.h
src_files += $(src_dir)/LuaSrc/*.hpp
lib_cmd = -Wl,--no-as-needed -ldl -L./$(src_dir)/LuaSrc/ -lluajit
#compile everything and output an executeable
all:
g++ $(gcc_options) $(src_files) $(lib_cmd) -o LuaJITSandbox.o
这里有一些错误:
./LuaHost/LuaSrc/libluajit.a(lj_clib.o): In function `lj_clib_index':
lj_clib.c:(.text+0x1c0): undefined reference to `dlsym'
./LuaHost/LuaSrc/libluajit.a(lj_clib.o): In function `lj_clib_load':
lj_clib.c:(.text+0x2c8): undefined reference to `dlopen'
lj_clib.c:(.text+0x350): undefined reference to `dlerror'
lj_clib.c:(.text+0x424): undefined reference to `dlopen'
libluajit.a 已在同一台机器上编译,一台 RaspberryPi。
【问题讨论】:
-
链接很重要时库的顺序。如果库 A 依赖于库 B,则 A 必须在命令行上在 B 之前。
-
将
-ldl添加到链接命令在输出之后,所以尝试将其移到末尾? -
@Galik 不,错误保持不变。如果我的命令顺序弄乱了很多,那并没有改变任何东西。
-
实际上从头开始。我想我起初误解了,我将其重新排列如下:'g++ $(gcc_options) $(src_files) $(lib_cmd) -o LuaJITSandbox.o -Wl,--no-as-needed -ldl'。现在它编译但给了我一个“在静态链接的应用程序中使用'dlopen'......”警告。我可以忽略这个吗?
-
有 3 种处理外部代码的方法:静态链接(“复制”现有代码,在需要的地方 - 你正在尝试什么,其中 - 除某些情况外 - 已过时)、动态链接(通过共享对象、重用现有代码)以及在运行时动态使用共享代码 (通过
dlopen/dlsym,您也在使用 - 这有点不寻常)。 Here 被描述为 静态链接器 应该注意的潜在问题。
标签: c++ linux gcc static-linking luajit