Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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++;链接器静态或动态链接libusb和pthreads?_C++_Linux_Ubuntu_Linker_G++ - Fatal编程技术网

C++ 是g++;链接器静态或动态链接libusb和pthreads?

C++ 是g++;链接器静态或动态链接libusb和pthreads?,c++,linux,ubuntu,linker,g++,C++,Linux,Ubuntu,Linker,G++,将-lusb-1.0和-pthread添加到编译命令时,它们是静态链接还是动态链接 g++ -pthread -o myprog obj1.o obj2.o -lusb-1.0 ldd给出以下输出 libusb-1.0.so.0 => /lib/x86_64-linux-gnu/libusb-1.0.so.0 (0x00007fc4662b7000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f

-lusb-1.0
-pthread
添加到编译命令时,它们是静态链接还是动态链接

g++ -pthread -o myprog obj1.o obj2.o -lusb-1.0
ldd给出以下输出

libusb-1.0.so.0 => /lib/x86_64-linux-gnu/libusb-1.0.so.0 (0x00007fc4662b7000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc465af7000)

。因此
是一个共享对象。我很困惑。如果是动态加载,如何解析符号?我认为
。所以
只能用符号加载,要获得符号的地址,可以使用

共享对象可以在编译时链接并在程序启动时加载,也可以在运行时使用dlopen动态加载

“将-lusb-1.0和-pthread添加到编译命令时,它们是静态链接还是动态链接?”如果编译器找到动态库,它将针对它们进行链接。否则,它将链接到静态库

这个

表示动态库在编译时链接

我很困惑。如果是动态加载,如何解析符号

请注意,Linux是,因此您可以下载并研究源代码 <>(C和C++编译器及其C++标准库的链接,或,或,…,…/P>的链接) 在Linux上,库最好是默认的(如果可用)共享库。因此,通过
gcc
g++
进行动态链接是隐含的首选项。如果未找到共享库,则链接静态库

在此之前,请阅读,a good,the book,,,some,,,以及C++11标准和Drepper的论文。请参阅项目(我创建的一个免费软件项目,它使用了代码> dLOpen< /code > C++代码)。 养成在编译时启用调试信息(以便以后使用调试器)和警告的习惯,因此
g++-Wall-Wextra-g-c src1.cc-o obj1.o
并注意到
g++
的参数顺序很重要。而
g++
实际上正在运行其他程序(
cc1plus
as
ld
)。将
-v
传递到
g++
,以找出哪个

我想。所以只能用dlopen加载

否,动态链接器正在加载共享库,可能由调用。使用

同时阅读并查看

将-lusb-1.0和-pthread添加到编译命令时,它们是静态链接还是动态链接

g++ -pthread -o myprog obj1.o obj2.o -lusb-1.0
默认情况下,共享库在Linux上链接。除非您要求静态链接,否则相应的共享库 对于
-pthread
-lusb-1.0
将被链接。如果需要,您可以通过
-static
选项告诉链接器您想要静态链接

.共享对象也是如此。我很困惑。如果是动态加载,如何解析符号

它是动态链接的,不在编译时加载。但是静态链接器()在编译时做了一些工作,因此当动态链接器()在运行时加载库时,它知道如何定位符号

编译时发生的情况是,静态链接器为PLT部分()中共享库中的符号创建“存根”地址。在程序加载时(或当符号被引用时),动态链接器/加载器将这些地址“填充”到实际地址,这是通过get()完成的。因此,实际的符号解析和加载是在运行时完成的,但在编译时需要静态链接器的帮助

我想。所以只能用dlopen加载,要获得一个符号的地址,可以使用dlsym

那不是真的。共享库既可以在编译时链接,也可以通过在运行时打开。编译时链接比通过
dlopen
打开要常见得多。实际上,几乎所有的系统二进制文件都是在Linux上动态链接的;动态链接是所有现代Linux系统的默认设置


如果您对详细信息感兴趣,请查看Drepper's。

共享库在生成时和运行时都是链接的。@BasileStrynkevich我没有说相反的话,但我可能没有说得很清楚。请在您的问题中提供一些,并明确定义静态链接的含义。如果
ldd
提到了一个库,那么它就是一个共享对象(因为任何静态库
libfoo.a
都不会出现在
ldd
的输出中)。谢谢你,我感谢你的详细回答。周末我一定要看报纸。