Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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
C++ 为什么g++;在库\ u PATH/./lib64中查找,该文档记录在哪里?_C++_Linux_Gcc_G++ - Fatal编程技术网

C++ 为什么g++;在库\ u PATH/./lib64中查找,该文档记录在哪里?

C++ 为什么g++;在库\ u PATH/./lib64中查找,该文档记录在哪里?,c++,linux,gcc,g++,C++,Linux,Gcc,G++,MyLIBRARY\u PATH环境变量中有一个自定义目录:/cs/public/lib/pkg/opencv/lib 但是,当我使用g++--print search dirs时,我得到了以下结果: libraries: = /cs/public/lib/pkg/opencv/lib/x86_64-suse-linux/4.6/: /cs/public/lib/pkg/opencv/lib/../lib64/: /usr/lib64/gcc/x86_64-suse-linux/4.6/: /u

My
LIBRARY\u PATH
环境变量中有一个自定义目录:
/cs/public/lib/pkg/opencv/lib

但是,当我使用
g++--print search dirs
时,我得到了以下结果:

libraries: =
/cs/public/lib/pkg/opencv/lib/x86_64-suse-linux/4.6/:
/cs/public/lib/pkg/opencv/lib/../lib64/:
/usr/lib64/gcc/x86_64-suse-linux/4.6/:
/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../../x86_64-suse-linux/lib/x86_64-suse-linux/4.6/:
/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../../x86_64-suse-linux/lib/../lib64/:
/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../x86_64-suse-linux/4.6/:
/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../../lib64/:
/lib/x86_64-suse-linux/4.6/:
/lib/../lib64/:
/usr/lib/x86_64-suse-linux/4.6/:
/usr/lib/../lib64/:
/cs/public/lib/pkg/opencv/lib/:
/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../../x86_64-suse-linux/lib/:
/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../:
/lib/:
/usr/lib/
为什么在我在
LIBRARY\u PATH
变量中明确指定的内容之前,g++会查看这些备选方案和一大堆其他系统位置,这是在哪里记录的

我可以理解,如果在库路径和库路径/./lib64等之前搜索系统默认值,那么g++会先搜索库路径/./lib64,然后搜索系统路径,然后搜索库路径。该订单记录在哪里

我的g++版本是
g++(SUSE Linux)4.6.2


我的操作系统是openSUSE 12.1(x86_64)看起来交叉编译需要它。从变更日志:

  Wed Mar 29 14:53:23 1995  Jim Wilson  <wilson@cygnus.com>

          * gcc.c (process_command): Delete code modifying gcc_exec_prefix.
          (main): Put it here after last use of gcc_exec_prefix.  For cross
          compiler, set startfile_prefixes if gcc_exec_prefix is set and
          standard_startfile_prefix is a relative path.

编译器将首先查看默认路径,然后查看其他路径。
当您打印“我现在不知道”时,它是如何排序的,但在这里有记录。

这里也提出了类似的问题:

这些看起来吓人的搜索路径至少部分是在编译器自身构建时确定的,例如在配置阶段。很明显,它超出了环境变量的范围,因为可以安装多个GCC副本,并让每个副本为
GCC--print search dirs
提供不同的结果。还注意到
g++--print search dirs
gcc--print search dirs
给出了不同的结果,指出g++包装器也影响了搜索路径。除了配置/构建时间的差异,GCC肯定知道自己的可执行文件所在的路径,并将搜索该路径的子目录。在GCC文档中可以找到许多这种炼金术:


据我所知,在不编译自己的GCC副本的情况下,最有效的方法是使用-L选项指定自定义库。我之所以这样说,是因为-L是在LIBRARY_PATH之前搜索的(参见上面关于环境变量的链接)。为了让它更容易接受,您可以在.bashrc文件中添加一个g++别名,包括-L选项

如果您想要一个明确的答案,那么下载GCC源代码的副本是一种方法。例如,在gcc.c中出现了以下极具启发性的评论:

/* Build a list of search directories from PATHS.
   PREFIX is a string to prepend to the list.
   If CHECK_DIR_P is true we ensure the directory exists.
   If DO_MULTI is true, multilib paths are output first, then
   non-multilib paths.
   This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
   It is also used by the --print-search-dirs flag.  */

但是,注释后面的功能不是很明显。

这是一种多库工作机制,允许在一台机器上为多个体系结构提供库(以及整个编译和构建工具链)。声明“multilib后缀被附加到GCC搜索库的所有目录中,并通过-L选项传递给链接器。链接器本身对multilibs没有任何特定的知识,如果在-L路径中找不到库,它将继续查询其默认搜索目录。如果在一次编译中使用了多个正交ABI更改选项,则可以串联使用多个多库后缀。“

因此,根据上面的描述,体系结构标记字符串或其不同变体被附加到编译器接收到的每个库搜索路径,因为它不区分默认路径和自定义路径。自定义路径位于第一行,但它与其他路径经历相同的“扩展”过程


由于需要处理i386兼容性,现在大多数x64发行版似乎默认使用多库机制,这实际上意味着大部分安装都在那里。

路径由内置规范定义。规范定义管道如何处理源代码以获得结果。GCC只驱动编译

您可以通过
-spec=
为GCC提供您自己的规范文件,并且可以通过
-dumpspecs
IIRC获得内置规范


这可能在GCC手册的某个地方解释过。

我在以下方面有完全相同的问题:

Fedora 17, gcc 4.7 and gcc 4.3
CentOS 6.3, gcc 4.4
Unubuntu 12, gcc 4.6
因此,这似乎是大多数gcc版本的问题。可能这种奇怪的行为最早出现在GCC4.2中,至少根据

我尝试复制规范并使用它们。它看起来像是
*multilib
规范用于根据平台附加特定字符串。例如,我原来的SPAC看起来像:

*multilib:
. !m64 !m32;64:../lib64 m64 !m32;32:../lib !m64 m32;

当我将
64:../lib64
更改为
64:../lib
时,gcc添加了
。/lib
。但我无法完全理解
*multilib
或任何其他规范的含义。

此答案试图总结gcc和Clang的搜索路径行为

海湾合作委员会 包含路径:用于以下格式的命令行:

CPLUS_INCLUDE_PATH=EDIR g++ -IIDIR -isystemSDIR
LIBRARY_PATH=EDIR gcc -BBDIR -LLDIR
CPLUS_INCLUDE_PATH=EDIR clang++ --gcc-toolchain=GCCDIR -BBDIR -IIDIR -isystemSDIR
LIBRARY_PATH=EDIR clang --gcc-toolchain=GCCDIR -BBDIR -LLDIR    
以下目录列表用作
#include
的搜索路径:

库路径:用于以下格式的命令行:

CPLUS_INCLUDE_PATH=EDIR g++ -IIDIR -isystemSDIR
LIBRARY_PATH=EDIR gcc -BBDIR -LLDIR
CPLUS_INCLUDE_PATH=EDIR clang++ --gcc-toolchain=GCCDIR -BBDIR -IIDIR -isystemSDIR
LIBRARY_PATH=EDIR clang --gcc-toolchain=GCCDIR -BBDIR -LLDIR    
将以下参数传递给链接器:

-LLDIR                                         # '-L' directories.
-LBDIR                                         # '-B' directories.
-LEDIR/../libXX                                # Multilib directories from LIBRARY_PATH.
-LGCCDIR/lib/gcc/GCCARCH/GCCVER                # GCC arch-specific library directory.
-LGCCDIR/libXX                                 # GCC multilib library directory.
-L/libXX                                       # System multilib library directory.
-L/usr/libXX                                   # System multilib library directory. 
-LEDIR                                         # LIBRARY_PATH directories.
-LGCCDIR/lib                                   # Other GCC libraries.
-LLDIR                                         # '-L' directories.
-LGCCDIR/lib/gcc/GCCARCH/GCCVER                # GCC arch-specific library directory.
-LGCCDIR/libXX                                 # GCC multilib library directory.
-L/libXX                                       # System multilib library directory.
-L/usr/libXX                                   # System multilib library directory.
-LGCCDIR/lib                                   # Other GCC libraries.
-LCLANGDIR/lib                                 # Clang libraries.
-L/lib                                         # System library directory.
-L/usr/lib                                     # System library directory.
-LEDIR                                         # LIBRARY_PATH directories.
叮当声 包含路径:用于以下格式的命令行:

CPLUS_INCLUDE_PATH=EDIR g++ -IIDIR -isystemSDIR
LIBRARY_PATH=EDIR gcc -BBDIR -LLDIR
CPLUS_INCLUDE_PATH=EDIR clang++ --gcc-toolchain=GCCDIR -BBDIR -IIDIR -isystemSDIR
LIBRARY_PATH=EDIR clang --gcc-toolchain=GCCDIR -BBDIR -LLDIR    
以下目录列表用作
#include
的搜索路径:

库路径:用于以下格式的命令行:

CPLUS_INCLUDE_PATH=EDIR g++ -IIDIR -isystemSDIR
LIBRARY_PATH=EDIR gcc -BBDIR -LLDIR
CPLUS_INCLUDE_PATH=EDIR clang++ --gcc-toolchain=GCCDIR -BBDIR -IIDIR -isystemSDIR
LIBRARY_PATH=EDIR clang --gcc-toolchain=GCCDIR -BBDIR -LLDIR    
将以下参数传递给链接器:

-LLDIR                                         # '-L' directories.
-LBDIR                                         # '-B' directories.
-LEDIR/../libXX                                # Multilib directories from LIBRARY_PATH.
-LGCCDIR/lib/gcc/GCCARCH/GCCVER                # GCC arch-specific library directory.
-LGCCDIR/libXX                                 # GCC multilib library directory.
-L/libXX                                       # System multilib library directory.
-L/usr/libXX                                   # System multilib library directory. 
-LEDIR                                         # LIBRARY_PATH directories.
-LGCCDIR/lib                                   # Other GCC libraries.
-LLDIR                                         # '-L' directories.
-LGCCDIR/lib/gcc/GCCARCH/GCCVER                # GCC arch-specific library directory.
-LGCCDIR/libXX                                 # GCC multilib library directory.
-L/libXX                                       # System multilib library directory.
-L/usr/libXX                                   # System multilib library directory.
-LGCCDIR/lib                                   # Other GCC libraries.
-LCLANGDIR/lib                                 # Clang libraries.
-L/lib                                         # System library directory.
-L/usr/lib                                     # System library directory.
-LEDIR                                         # LIBRARY_PATH directories.
总结 在GCC和Clang中,Include的搜索路径几乎相同。如果在这两种情况下都使用C前端,则会忽略C++特定的路径。GCC和Clang之间的库搜索路径有很大的不同,特别是存在
-B
目录以及GCC前端中对
库路径
的奇怪操作

<> P>库搜索路径对于C和C++前端都是相同的。其他库搜索路径是由链接器本身引入的。
# Multilib library directories.
SEARCH_DIR("BINUTILSDIR/BINUTILSARCH/libXX");
SEARCH_DIR("BINUTILSDIR/libXX");
SEARCH_DIR("/usr/local/libXX");
SEARCH_DIR("/libXX");
SEARCH_DIR("/usr/libXX");
# Traditional library directories.
SEARCH_DIR("BINUTILSDIR/BINUTILSARCH/lib");
SEARCH_DIR("BINUTILSDIR/lib");
SEARCH_DIR("/usr/local/lib");
SEARCH_DIR("/lib");
SEARCH_DIR("/usr/lib");
还必须注意的是,库依赖项不是