【问题标题】:Shared library missing header file that I know exists共享库缺少我知道存在的头文件
【发布时间】:2021-10-12 17:18:07
【问题描述】:

我有一个大致相当于这个的项目结构:

>>> ls -R
- whatever
-   libfoo.so
-   foo.h
-   foo.c
-   test2.c
- however
-   test1.c

libfoo.so 是一个库,test.c 是一个简单的库,现在包含 foo.h 并打印“Hello World!”。 我可以用gcc test1.c -o test -std=c2x -L/dir/to/lib -lfoo 编译 但是当我尝试运行 test 时,我得到:

error while loading shared libraries: liblfoo.so: cannot open shared object file: No such file or directory

我该怎么办?

【问题讨论】:

  • 您正在执行-lfoo,但它抱怨缺少liblfoo.so 而不是libfoo.so。哪里有错字?
  • @CraigEstey 是的,这是为了展示示例而在重构时打错了字
  • 考虑将-rpath-L一起使用(或代替)
  • 您可以查看readelf -a test 输出以查看将搜索哪些目录。
  • @CraigEstey 我运行了该命令但找不到任何目录

标签: c gcc makefile shared-libraries


【解决方案1】:

这是因为你的共享库不在LD_LIBRARY_PATH中,只需将so文件所在文件夹的路径放在你的环境变量中,你可能想要要将其永久放入您的 bash 配置文件中,只需将以下命令放入“.bashrc”文件中:

export LD_LIBRARY_PATH=/home/user/the_folder_you_are_working_on/:$LD_LIBRARY_PATH

echo 'export LD_LIBRARY_PATH=/home/user/the_folder_you_are_working_on/:$LD_LIBRARY_PATH' >> ~/.bashrc

【讨论】:

  • 如果我是发布程序的人,应该做什么?
  • @user852541 不能静态链接库有什么原因吗?
【解决方案2】:

正如我在顶级 cmets 中提到的,使用 -rpath ...

执行以下操作(例如):

LIBDIR=/dir/to/lib

gcc test1.c -o test -std=c2x -L$LIBDIR -Wl,-rpath=$LIBDIR -lfoo

对于多个库/目录,这里有一个示例Makefile

LIBS += -lmy
LIBS += -lmy2

TOP = /tmp/myall
DIRS += $(TOP)/mylib
DIRS += $(TOP)/mylib2

PATHL := $(addprefix -L,$(DIRS))

PATHR := $(addprefix :,$(DIRS))
PATHR := $(shell echo $(PATHR) | sed -e s/:/-Wl,-rpath=/g)

test:
    cc -o test test.c $(PATHL) $(PATHR) $(LIBS)

clean:
    rm -f test

这是make的输出:

cc -o test test.c -L/tmp/myall/mylib -L/tmp/myall/mylib2 -Wl,-rpath=/tmp/myall/mylib -Wl,-rpath=/tmp/myall/mylib2 -lmy -lmy2

这是readelf -a test的sn-p:

Dynamic section at offset 0x2df0 contains 27 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libmy.so]
 0x0000000000000001 (NEEDED)             Shared library: [libmy2.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [/tmp/myall/mylib:/tmp/myall/mylib2]

请注意,如果我们省略-rpath,ELF 文件的RPATH 部分将不会生成。这就是问题所在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    相关资源
    最近更新 更多