Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用gcc禁止默认库路径_C_Gcc - Fatal编程技术网

使用gcc禁止默认库路径

使用gcc禁止默认库路径,c,gcc,C,Gcc,有没有办法禁止使用gcc进行默认库路径搜索-nostdinc对include路径搜索执行此操作,但是-nostdlib通过省略或设计,仅禁止-lc-lgcc等,而不禁止库搜索路径。您可以尝试-nodefaultlibs以避免所有默认库,然后使用-L和-L将所需库添加回所需目录中。 在命令行中使用-L选项指定的目录应优先于默认目录。只需设置库路径环境变量如何 如果我正确理解了这个问题,您需要做一些事情,比如强制链接器在默认路径之前查看本地库路径,这样您就可以显式地设置该变量来控制顺序。假设基础加载

有没有办法禁止使用gcc进行默认库路径搜索
-nostdinc
对include路径搜索执行此操作,但是
-nostdlib
通过省略或设计,仅禁止
-lc-lgcc
等,而不禁止库搜索路径。

您可以尝试-nodefaultlibs以避免所有默认库,然后使用-L和-L将所需库添加回所需目录中。
在命令行中使用-L选项指定的目录应优先于默认目录。

只需设置
库路径
环境变量如何


如果我正确理解了这个问题,您需要做一些事情,比如强制链接器在默认路径之前查看本地库路径,这样您就可以显式地设置该变量来控制顺序。

假设基础加载程序是
ld
,您可以使用

--sysroot=directory
(我不记得必须使用哪个选项将加载程序参数传递给gcc,但有一个…)


你可以让“目录”是假的,找不到任何库,或者模仿你自己项目的目录布局。

你应该可以用它来做这件事(尽管对我来说,摆弄这些似乎是一门黑暗的艺术……)

如果查看
gcc-dumpspecs
的输出,则
link_命令
spec是构建实际调用的命令的命令。深入研究它引用的一些其他规范,
link\u libgcc
spec,它通常被定义为(至少对于本机编译器而言):

罪魁祸首是:

%D

为GCC认为可能包含启动文件的每个目录转储一个-L选项。如果目标支持multilibs,则当前multilib目录将在这些路径的前面

您可以通过创建一个文件(例如,
my.specs
)替代您选择的路径来覆盖它:

*link_libgcc:
-L/foo/bar -L/blah/blah

然后将
-specs=my.specs
传递到
gcc

它不会删除库路径,只删除库。加回目录也没用,因为配置脚本仍然会很高兴地在旧的默认路径中找到库并尝试使用它们…您在gcc命令行上由-L指定的目录中是否有一个库被默认目录中的目录忽略,或者您的配置脚本正在拾取它们?我的问题是根据备用路径构建程序使用现有gcc安装和包装器脚本的库生态系统。只要存在默认搜索路径,各种程序的配置脚本就可以找到作为主机库生态系统一部分的库,并愉快地尝试使用它们,但后来由于不兼容而失败……R,您的问题是关于gcc以及它在哪里搜索库,但您现在谈论的是配置脚本。我的意思是,如果您在gcc命令行中使用-L列出您的备用目录,那么gcc将使用这些目录。如果这些备用目录中没有任何备用lib,那么gcc将使用默认目录。你是不是想得到一个链接失败?我不是想用gcc来解决一个特定的问题,我只是想用gcc来解决一个一般性的问题。我的问题是为了实施解决一般问题的办法;我想确保根本没有搜索默认库路径。只需在默认路径之前搜索一个新路径是很容易的,使用一个包装器脚本,它可以执行
gcc“$@”-L/new/path
。为什么不直接使用编译器,编译:)并使用
ld
直接执行链接步骤?@Jens:这意味着重新实现整个编译器驱动程序行为(“gcc”命令)在C或shell脚本中。这不是不可能的,但是要做gcc应该已经能够做的事情,还需要做大量的工作。
--sysroot
可能存在的问题是,它也会影响手动传递的任何
-L
选项(因此这种方法基本上只会使它不存在任何库路径),
--sysroot
不会影响
-L
选项。哇,我想你找到了“罪魁祸首”!最重要的是,gcc似乎接受了
/dev/fd/3
和一个“here”文件(顺便说一句,如果这能解决我的所有需求,我会给这个问题添加一个悬赏并分配给你。谢谢-我很高兴这是有帮助的!是的,不知何故我从未意识到(1)这些路径在规范文件中的确切位置,因为它们隐藏在
%D
中,而不是硬编码,以及(2)你可以传递一个部分specfile,只覆盖一些内容,而不必生成一个定义所有内容的完整specfile。你的回答大大扩展了我对如何自定义gcc行为的理解。
*link_libgcc:
-L/foo/bar -L/blah/blah