共享库缺少我知道存在的头文件
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
部分将 不会 生成。就是这个问题。
我的项目结构大致相当于:
>>> 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
部分将 不会 生成。就是这个问题。