c++ - 与 gcc 静态链接时为 "Undefined reference to dlopen"

标签 c++ linux gcc static-linking luajit

阅读了大量 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)上编译。

最佳答案

我认为-static不是你所追求的。 -static将建立一个static application并且意味着link this static library to the application .

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

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

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

关于c++ - 与 gcc 静态链接时为 "Undefined reference to dlopen",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41516693/

相关文章:

c++ - 如何用C++从文件中读取结构化数据?

c++ - 如何让类在没有 getter 的情况下返回其他类型?

C++:包括头文件编译失败但包括源 cpp 文件编译

linux - 树莓派 : How to specify the default runlevel?

c - Linux共享对象编译问题

python - OpenCV-如何消除凸轮扫描仪中的凸度缺陷?

java - 具有列 : Remove alternating background coloring for rows on Linux/Mac 的 SWT 树

linux - 使用 wmcrtl 在同一应用程序的窗口中循环

c++ - 如何使用安装在 macports 中的 gcc?

gcc - 使用-pg编译时更改gmon.out文件的名称