【问题标题】:Where is the documentation of c lang env variables?c lang env 变量的文档在哪里?
【发布时间】:2020-05-17 15:19:39
【问题描述】:

TLDR 我试图阅读 clang llvm 文档以找到传递库路径的方法,但没有成功。然后我搜索并找到了解决方案。我很好奇在哪里可以找到我的解决方案的文档。

详情及原因

我试图在我的 catalina 上运行 ruby​​ 的包,但遇到了这个错误:

ld: library not found for -lssl

我使用brew install openssl 重新安装了openssl,然后brew link openssl 我收到了以下回复:

Warning: Refusing to link macOS provided/shadowed software: openssl@1.1
If you need to have openssl@1.1 first in your PATH run:
  echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.zshrc

For compilers to find openssl@1.1 you may need to set:
  export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
  export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"

For pkg-config to find openssl@1.1 you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig"

虽然我很欣赏 brew 的努力,使其无法正常工作。我将链接器问题缩小到这个范围,看看发生了什么:

clang -dynamic -bundle -o asdf  -L/usr/local/Cellar/mysql/8.0.19/lib -lmysqlclient -lssl -lcrypt -v 

终于using LIBRARY_PATH我通过了环境变量

export LIBRARY_PATH=/usr/local/opt/openssl@1.1/lib/

【问题讨论】:

    标签: linker clang bundle


    【解决方案1】:

    您可以建立clang 链接:

    clang -dynamic -bundle -o asdf  -L/usr/local/Cellar/mysql/8.0.19/lib -lmysqlclient -lssl -lcrypt -v
    

    通过设置失败时成功:

    export LIBRARY_PATH=/usr/local/opt/openssl@1.1/lib/
    

    clang 命令的环境中。

    这证明clang 受到LIBRARY_PATH 环境的影响 变量的方式与 GCC 编译器相同。

    LIBRARY_PATHman clangENVIRONMENT 部分中没有提及, 或者实际上根本没有,所以这种类似 GCC 的行为可以严格地被视为不是强制性的。 然而,遗漏似乎是手册中的疏忽, 因为clang 通常会努力成为gcc 的不引人注目的替代品。如果 我们以详细模式运行 Linux clang 链接:

    $ export LIBRARY_PATH=/wheres/wally; clang -v main.o -L. -lfoo -lbar 
    clang version 10.0.0-4ubuntu1 
    Target: x86_64-pc-linux-gnu
    Thread model: posix
    InstalledDir: /usr/bin
    Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/8
    Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/9
    Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/8
    Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/9
    Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/9
    Candidate multilib: .;@m64
    Selected multilib: .;@m64
     "/usr/bin/ld" -z relro --hash-style=gnu --build-id --eh-frame-hdr \
     -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out \
     /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crt1.o \
     /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o \
     /usr/bin/../lib/gcc/x86_64-linux-gnu/9/crtbegin.o \
     -L. -L/usr/bin/../lib/gcc/x86_64-linux-gnu/9 \
     -L/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu \
     -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu \
     -L/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../.. \
     -L/usr/lib/llvm-10/bin/../lib -L/lib -L/usr/lib \
     -L/wheres/wally \              # < There's wally!
     main.o -lfoo -lbar -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc \
     --as-needed -lgcc_s --no-as-needed \
     /usr/bin/../lib/gcc/x86_64-linux-gnu/9/crtend.o \
     /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o
    

    我们观察到clang-L${LIBRARY_PATH} 的扩展插入到 ld 命令行在所有其他 -Ldir 选项之后。如果我们 追踪LIBRARY_PATH in the clang source tree, 我们将看到使它这样做的代码。

    man gccENVIRONMENT 部分, LIBRARY_PATH 已记录在案:

    LIBRARY_PATH

    LIBRARY_PATH 的值是一个以冒号分隔的目录列表,很像 PATH 。 当配置为本地编译器时,GCC 会尝试指定的目录 搜索特殊链接器文件,如果使用 GCC_EXEC_PREFIX 找不到它们。 使用 GCC 链接在搜索普通库时也会用到这些目录 对于 -l 选项(但使用 -L 指定的目录在前)。

    同样在GCC online documentation: 3.21 Environment Variables Affecting GCC中逐字出现

    clangLIBRARY_PATH 的作用符合我强调的句子。

    值得知道的是,虽然为此目的使用LIBRARY_PATH 可能已经 你出一个果酱,它在常规联动练习中不受青睐,因为它是 当你研究一个 链接:其效果仅在详细模式下显示(通过gccclang)。这 安装人员的建议:

    export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
    

    是您所期望的。我不知道为什么它不适合你。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 2011-03-18
      • 2010-09-18
      • 2018-02-01
      • 2020-11-18
      • 2019-03-07
      • 1970-01-01
      相关资源
      最近更新 更多