链接库时,默认目录上的gcc或g ++路径搜索顺序

时间:2017-06-07 00:51:24

标签: c++ c gcc linker g++

我看过this文章并了解到:

  1. 在默认目录之前搜索命令行中使用-L选项指定的目录。
  2. -L中指定的目录按照在命令行中指定的顺序进行搜索。
  3. 问题是:是否有默认目录的搜索顺序?

    例如,如果我运行此命令:

    $ gcc -Xlinker --verbose  2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g'  | grep -vE '^$'
    

    (从this article复制的命令)

    它在我的机器中的/usr/local/lib之前打印出/usr/lib(Ubuntu 16.04,64位,gcc 5.4.0)。在这种情况下,会在/usr/local/lib之前搜索/usr/lib吗?

1 个答案:

答案 0 :(得分:1)

来自binutils ld manual部分3.4.2 Commands Dealing with Files

  

SEARCH_DIR(路径)

     

SEARCH_DIR命令添加路径到ld查找归档库的路径列表。使用SEARCH_DIR(路径)就像使用`-L path'在命令行上(请参阅命令行选项)。如果两者都使用,则链接器将搜索两个路径。首先搜索使用命令行选项指定的路径。

所以,是的,因为使用此SEARCH_DIR()命令在默认链接描述文件中给出了默认目录,它们将按SEARCH_DIR()命令出现的顺序进行搜索。

例如,在我的mingw安装中,默认链接描述文件的开头如下:

/* Default linker script, for normal executables */
/* Copyright (C) 2014-2017 Free Software Foundation, Inc.
   Copying and distribution of this script, with or without modification,
   are permitted in any medium without royalty provided the copyright
   notice and this notice are preserved.  */
OUTPUT_FORMAT(pei-i386)
SEARCH_DIR("=/mingw32/i686-w64-mingw32/lib");
SEARCH_DIR("=/mingw32/lib");
SEARCH_DIR("=/usr/local/lib");
SEARCH_DIR("=/lib");
SEARCH_DIR("=/usr/lib");

- > /usr/local/lib中的库可以覆盖/lib/usr/lib中的库,但不能覆盖mingw本身提供的库。