C++ Linux-查找g++;解放党

C++ Linux-查找g++;解放党,c++,linux,path,linker,g++,C++,Linux,Path,Linker,G++,我安装了这两个库:glut和curl sudo apt-get install libcurl4-gnutls-dev sudo apt-get install freeglut3-dev 当我必须编译一个程序时,我使用: g++ -o executable file11.cpp file2.cpp -lglut -lcurl 而且它有效 我如何知道链接器在哪里搜索“-lglut”或“-lcurl” “-lsomething”对应一条路径,我如何才能找到 它检查/lib,/usr/lib,以

我安装了这两个库:glut和curl

sudo apt-get install libcurl4-gnutls-dev
sudo apt-get install freeglut3-dev
当我必须编译一个程序时,我使用:

g++ -o executable file11.cpp file2.cpp -lglut -lcurl
而且它有效

我如何知道链接器在哪里搜索“-lglut”或“-lcurl”


“-lsomething”对应一条路径,我如何才能找到

它检查
/lib
/usr/lib
,以及传递给
-L
的任何路径它检查
/lib
/usr/lib
,以及传递给
-L
的任何路径 它只是将字符串转换为文件名,并检查其正常位置。

它只是将字符串转换为文件名,并检查其正常位置。

试试看

ldd /path/to/your/executable
试一试


链接器将在
-L
选项指定的目录和标准系统目录中查找,这些目录通常是
/lib
/usr/lib
。虽然您没有使用任何<代码> -L/COD>选项,但GCC通常会传递一些链接到链接器,这样它就可以找到GCC自己的库(例如C++标准库),除非您使用<代码> -NoSTDLIB < /C>。GCC还将为
库路径
环境变量的内容添加
-L
选项

要查看GCC传递给链接器的选项,您可以使用
-v
(详细信息)进行编译;要查看链接器使用的库,您可以将
-Wl,--trace
传递给GCC,这会使它将
--trace
传递给链接器,从而使其输出类似于:

/usr/bin/ld: mode elf_x86_64
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crt1.o
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crti.o
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/crtbegin.o
/tmp/ccJHrbSx.o
-lglut (/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libglut.so)
-lcurl (/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libcurl.so)
-lgcc_s (/usr/lib/gcc/x86_64-redhat-linux/4.7.2/libgcc_s.so)
/lib64/libc.so.6
(/usr/lib64/libc_nonshared.a)elf-init.oS
/lib64/ld-linux-x86-64.so.2
-lgcc_s (/usr/lib/gcc/x86_64-redhat-linux/4.7.2/libgcc_s.so)
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/crtend.o
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crtn.o
这显示了在我的系统上为
-lglut
lcurl
libs找到的库。lib位于该路径中,因为在我的系统上,GCC将
-L/usr/lib/GCC/x86_64-redhat-linux/4.7.2/../../../../../../../../../lib64
传递给链接器(通过使用
-v
编译显示)

您可以使用
readlink

$ readlink -f /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/
/usr/lib64/

链接器将在
-L
选项指定的目录和标准系统目录中查找,这些目录通常是
/lib
/usr/lib
。虽然您没有使用任何<代码> -L/COD>选项,但GCC通常会传递一些链接到链接器,这样它就可以找到GCC自己的库(例如C++标准库),除非您使用<代码> -NoSTDLIB < /C>。GCC还将为
库路径
环境变量的内容添加
-L
选项

要查看GCC传递给链接器的选项,您可以使用
-v
(详细信息)进行编译;要查看链接器使用的库,您可以将
-Wl,--trace
传递给GCC,这会使它将
--trace
传递给链接器,从而使其输出类似于:

/usr/bin/ld: mode elf_x86_64
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crt1.o
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crti.o
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/crtbegin.o
/tmp/ccJHrbSx.o
-lglut (/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libglut.so)
-lcurl (/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libcurl.so)
-lgcc_s (/usr/lib/gcc/x86_64-redhat-linux/4.7.2/libgcc_s.so)
/lib64/libc.so.6
(/usr/lib64/libc_nonshared.a)elf-init.oS
/lib64/ld-linux-x86-64.so.2
-lgcc_s (/usr/lib/gcc/x86_64-redhat-linux/4.7.2/libgcc_s.so)
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/crtend.o
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crtn.o
这显示了在我的系统上为
-lglut
lcurl
libs找到的库。lib位于该路径中,因为在我的系统上,GCC将
-L/usr/lib/GCC/x86_64-redhat-linux/4.7.2/../../../../../../../../../lib64
传递给链接器(通过使用
-v
编译显示)

您可以使用
readlink

$ readlink -f /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/
/usr/lib64/

这将告诉您运行时链接器在何处找到所需的库,这不一定与在链接处找到它们的位置相同-time@JonathanWakely看这篇文章,似乎(1)没有向链接器传递指示库位置的标志,以及(2)编译后的程序正在同一系统上执行,但未指定
LD\u LIBRARY\u PATH
。在这种情况下,
ldd
将产生与编译使用的lib几乎相同的lib集,但不一定。链接时
$LD\u RUN\u PATH
的内容和运行时
LD.so.conf
的内容也会影响它。因此,尽管ldd可能很有用,但它并不总是显示与链接时找到的libs相同的内容。正如我所说的,它不一定是相同的。或者更准确地说,它受运行时动态链接器缓存的内容的影响,这受上次重建缓存时
/etc/ld.so.conf
的内容的影响。这告诉您运行时链接器在哪里找到所需的库,这不一定和他们在林克找到的地方一样-time@JonathanWakely看这篇文章,似乎(1)没有向链接器传递指示库位置的标志,(2)编译的程序在同一系统上执行,没有指定
LD\u LIBRARY\u PATH
。在这种情况下,
ldd
将产生与编译使用的lib几乎相同的lib集,但不一定。链接时
$LD\u RUN\u PATH
的内容和运行时
LD.so.conf
的内容也会影响它。因此,尽管ldd可能很有用,但它并不总是显示与链接时找到的libs相同的内容。正如我所说的,它不一定相同。或者更准确地说,它受运行时动态链接器缓存的内容的影响,而动态链接器缓存受上次重建缓存时
/etc/ld.so.conf
的内容的影响。