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
的输出中)。谢谢你,我感谢你的详细回答。周末我一定要看报纸。