【问题标题】:How to add a directory to the search path of GCC (crti.o not found)如何将目录添加到GCC的搜索路径(crti.o not found)
【发布时间】:2019-07-03 14:03:57
【问题描述】:

我正在安装 GSI V3.5 https://dtcenter.org/com-GSI/users/。我在 gcc 方面没有经验,所以我不能为此使用正确的术语。 编译程序后出现错误

”...... "/raid60/raid2/opt/local/bin/../lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/../../../../x86_64-conda_cos6-linux-gnu /bin/ld: 找不到 Scrt1.o:没有这样的文件或目录 /raid60/raid2/opt/local/bin/../lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/../../../../x86_64-conda_cos6-linux-gnu/垃圾箱/LD: 找不到 crti.o:没有这样的文件或目录 /raid60/raid2/opt/local/bin/../lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/../../../../x86_64-conda_cos6-linux-gnu/垃圾箱/LD: 找不到-lm /raid60/raid2/opt/local/bin/../lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/../../../../x86_64-conda_cos6-linux-gnu/垃圾箱/LD: 找不到-lgomp"

gcc 好像有问题,找不到 目录包括 Scrt1.0、crti.o 等。我发现这些文件在 这个目录 /home/opt/anaconda/x86_64-conda_cos6-linux-gnu/sysroot/usr/lib. 因为我没有管理员权限,所以我可以 不要安装 libc6-dev 之类的软件包。跟随 https://askubuntu.com/questions/251978/cannot-find-crti-o-no-such-file-or-directoryhttps://askubuntu.com/questions/251978/cannot-find-crti-o-no-such-file-or-directory, 我将上面的目录添加到 ~/.cshrc。

  setenv LD_LIBRARY_PATH
  /home/opt/anaconda/x86_64-conda_cos6-linux-gnu/sysroot/usr/lib

但 gcc 仍然无法识别此路径。

我还尝试使用 LDFLGAS 将此路径输入到配置中

 > ./configure
 > LDFLAGS="-L/home/opt/anaconda/x86_64-conda_cos6-linux-gnu/sysroot/usr/lib"

但没有成功。最后我将 LDFLAGS 添加到配置中

脚本。但它也没有奏效。任何帮助都非常感谢。

当然,预期的答案是让 gcc 识别路径

crti.o 和其他丢失的文件。

更新: 正如 Florian Weimer 所建议的,我制作了 crt.specs 文件。我还更新了配置中的相关行。这些文件位于 dropbox link 中。但我仍然遇到同样的错误。

更新 2。 这些是发生错误之前的一些行:

../write_obsdiags.o ../wrwrfmassa.o ../wrwrfnmma.o -L/opt/local/wrf_kpp/gsi35/comGSIv3.5_EnKFv1.1/lib -lsp_i4r8 -lsigio_i4r4 -lsfcio_i4r4 -lnemsio -lbacio -lw3nco_i4r8 -lbufr_i4r8 -lw3emc_i4r8 -lcrtm /opt/local/wrf_kpp/WRFV3//externalio_int/ libwrfio_int.a /opt/local/wrf_kpp/WRFV3//external/io_netcdf/libwrfio_nf.a /opt/local/wrf_kpp/WRFV3//frame/pack_utils.o /opt/local/wrf_kpp/WRFV3//frame/module_machine.o /opt/local/wrf_kpp/WRFV3//frame/module_driver_constants.o -L/home/srvx11/lehre/users/a1276905/.conda/envs/libgsi/lib -lnetcdff -lnetcdf -L/home/srvx11/lehre/users/a1276905/.conda/envs/libgsi/lib -L/home /srvx11/lehre/users/a1276905/.conda/envs/libgsi/lib -llapack -lblas -fopenmp /raid60/raid2/opt/local/bin/../lib/gcc/x86_64-conda_cos6-linux-gnu/7.3 .0/../../../../x86_64-conda_cos6-linux-gnu/bin/ld: 找不到 Scrt1.o:没有这样的文件或目录

更新 3 我使用选项 -B 将包含 crti.o 的目录添加到 gcc 的搜索路径中。 当我调用

gcc -print-search-dirs

我在已知路径中看到了我想要的路径“/home/opt/anaconda/x86_64-conda_cos6-linux-gnu/sysroot/usr/lib”

库: =/home/opt/anaconda/x86_64-conda_cos6-linux-gnu/sysroot/usr/lib/x86_64-unknown-linux-gnu/5.3.0/:/home/opt/anaconda/x86_64-conda_cos6-linux-gnu/ sysroot/usr/lib/:/usr/local/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/:/usr/local/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/ ../../../../x86_64-unknown-linux-gnu/lib/x86_64-unknown-linux-gnu/5.3.0/:/usr/local/lib/gcc/x86_64-unknown-linux- gnu/5.3.0/../../../../x86_64-unknown-linux-gnu/lib/../lib64/:/usr/local/lib/gcc/x86_64-unknown-linux-gnu /5.3.0/../../../x86_64-unknown-linux-gnu/5.3.0/:/usr/local/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/.. /../../../lib64/:/lib/x86_64-unknown-linux-gnu/5.3.0/:/lib/../lib64/:/usr/lib/x86_64-unknown-linux-gnu /5.3.0/:/usr/lib/../lib64/:/usr/local/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/../../../../ x86_64-unknown-linux-gnu/lib/:/usr/local/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/../../../:/lib/:/usr/lib /

但我还没有结束。

【问题讨论】:

    标签: unix gcc csh


    【解决方案1】:

    链接器搜索路径仅用于库。它不用于定位任何目标文件,包括启动目标文件。

    如果工具链是使用 sysroot 支持构建的,您可以使用 --sysroot 更改 GCC 查找其大部分文件的位置。这可能需要添加符号链接或复制文件来创建工作的 sysroot 环境,并且可能会有些麻烦。

    如果您只想更改启动文件的位置,您可以使用自定义 GCC 规范文件来实现。不幸的是,您需要使用的内容在某种程度上取决于 GCC 版本以及 GCC 的构建方式。这意味着作为起点,您需要使用 GCC 中内置的规范,您可以使用以下命令获取:

    gcc -dumpspecs
    

    此文件中有两个部分,*startfile:*endfile:,它们很有趣。将这两行和每行后面的行复制到一个新文件中,比如crt.specs。编辑它们并将Scrt1.ocrt1.ocrti.o(在*startfiles:)和crtn.o(在*endfiles:)替换为您要使用的文件的绝对路径(您从@提取的假定文件987654332@ 使用dpkg -x)。

    然后您可以通过以下方式调用 GCC 来使用新规范:

    gcc --specs=crt.specs
    

    如果可以让系统管理员安装libc6-dev包,肯定会省去很多麻烦。这是确保这些文件与libc6 包一起保持最新的唯一安全方法。

    【讨论】:

    • 亲爱的@Florian Weimer,感谢您的回复。我已经实施了你的建议。但我得到了同样的错误。我将添加创建的文件(crt.specs)并在我的问题的更新中进行配置。
    • 你确认specs文件被实际使用了吗? LDFLAGS 没有显示 specs=/path/to/crt.specs,所以这可能是它不起作用的原因。
    • 我在配置中有两行我认为应该更新:DM_CC = gcc --specs=/opt/local/wrf_kpp/gsi35/comGSIv3.5_EnKFv1.1/crt.specs 和 SCC = gcc --specs=/opt/local/wrf_kpp/gsi35/comGSIv3.5_EnKFv1.1/crt.specs。
    • 嗯。请将导致错误的实际链接器命令添加到问题中。
    • 对不起,我知道这让你很烦。但是我不知道您对 acutal 链接器命令的含义。我有一个配置文件和一个编译文件。你想让我发布这些文件的内容吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2019-01-17
    • 2022-12-13
    相关资源
    最近更新 更多