我发现在使用-rpath时必须给出-L标志.例如:
gcc -o test test.o -L. -lmylib -Wl,-rpath=.
Run Code Online (Sandbox Code Playgroud)
为什么需要-L标志?编译时需要哪些信息比h文件中的信息多?
如果我删除-L.我收到以下消息:
gcc -o test test.o -lmylib -Wl,-rpath=.
/usr/bin/ld: cannot find -lmyLib
Run Code Online (Sandbox Code Playgroud)
但是,删除这两个标志是完全可以的.像这样:
gcc -o test test.o -lmylib
Run Code Online (Sandbox Code Playgroud)
前提是可以在/ usr/lib中找到libmyLib.为什么现在不需要-L?
这是/sf/answers/593761591/的后续问题.
我不明白为什么当 -L 已经告诉共享库路径在哪里时有必要提供 rpath 或使用 LD_LIBRARY_PATH 设置环境变量。
这个答案说: -L 告诉 ld在链接时在哪里寻找要链接的库。
但为什么同时相应的-rpath没有自动设置呢?为什么我们需要再次手动执行?
PS:我想如果你有这个功能,那么可执行文件在其他环境中将毫无用处。但如果是这样,那么ld在链接过程中实际上做了什么,或者如果其他环境中的 -rpath 不同,为什么需要给出 -L 路径。
我正在构建一个使用“第三方”库的 C Python 扩展——在本例中,我使用单独的构建过程和工具链构建了一个。调用这个库libplumbus.dylib。
目录结构为:
grumbo/
include/
plumbus.h
lib/
libplumbus.so
grumbo.c
setup.py
Run Code Online (Sandbox Code Playgroud)
我的setup.py样子大约是:
from setuptools import Extension, setup
native_module = Extension(
'grumbo',
define_macros = [('MAJOR_VERSION', '1'),
('MINOR_VERSION', '0')],
sources = ['grumbo.c'],
include_dirs = ['include'],
libraries = ['plumbus'],
library_dirs = ['lib'])
setup(
name = 'grumbo',
version = '1.0',
ext_modules = [native_module] )
Run Code Online (Sandbox Code Playgroud)
由于 libplumbus 是一个外部库,当我运行时,import grumbo我得到:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: dlopen(/path/to/grumbo/grumbo.cpython-37m-darwin.so, 2): Library not loaded: lib/libplumbus.dylib
Referenced …Run Code Online (Sandbox Code Playgroud)