【问题标题】:"Undefined reference to dlopen" when statically linking with gcc与 gcc 静态链接时出现“未定义的 dlopen 引用”
【发布时间】: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


【解决方案1】:

我认为-static 不是你想要的。 -static 将构建一个 static application 并且 not 表示 link this static library to the application。

这里有几个选项。当您与 -lluajit 链接时,您可以删除库的动态 .so 版本。 gcc 将默认使用动态链接,但当动态库不可用或找不到时会回退到静态链接。

您可以直接指向静态库文件,而不是 -lluajit - 将其视为对象输入文件:/usr/lib/libluajit.a。

我认为推荐的方法是告诉链接器如何链接你的库。尝试使用-Wl,-Bstatic -lluajit。您可以在库名称前面的 Bstatic 和 Bdynamic 之间切换,以防您链接到多个库并希望以不同方式链接它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-24
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多