共享库缺少我知道存在的头文件

Shared library missing header file that I know exists

我的项目结构大致相当于:

>>> 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

我该怎么办?

这是因为你的共享库不在LD_LIBRARY_PATH中,直接把so文件所在文件夹的路径[=18] =] 在你的环境变量中,你可能想把它永久地放在你的 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

正如我在热门评论中提到的,使用 -rpath ...

执行以下操作(例如):

LIBDIR=/dir/to/lib

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

对于多个 libraries/directories,这里是示例 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 的片段:

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 部分将 不会 生成。就是这个问题。