相关疑难解决方法(0)

为什么在使用-rpath时需要-L?

我发现在使用-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/的后续问题.

linker gcc shared-libraries

19
推荐指数
2
解决办法
4094
查看次数

为什么使用共享库时 -L 不自动包含 -rpath?

我不明白为什么当 -L 已经告诉共享库路径在哪里时有必要提供 rpath 或使用 LD_LIBRARY_PATH 设置环境变量。

这个答案说: -L 告诉 ld在链接时在哪里寻找要链接的库。

但为什么同时相应的-rpath没有自动设置呢?为什么我们需要再次手动执行?

PS:我想如果你有这个功能,那么可执行文件在其他环境中将毫无用处。但如果是这样,那么ld在链接过程中实际上做了什么,或者如果其他环境中的 -rpath 不同,为什么需要给出 -L 路径。

rpath environment-variables ld

3
推荐指数
1
解决办法
1769
查看次数

包含和分发带有 Python C 扩展的第三方库

我正在构建一个使用“第三方”库的 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)

c python setuptools python-c-api python-extensions

3
推荐指数
1
解决办法
717
查看次数