编译与静态或动态库的c ++链接

时间:2017-01-16 16:27:06

标签: c++ shared-libraries static-libraries

使用以下命令编译程序时,是否链接到静态库或动态库?

g++ blink.cpp -o blink -lmraa

其次,这个图书馆已安装'来自使用这些命令的PPA

sudo add-apt-repository ppa:mraa/mraa
sudo apt-get update
sudo apt-get install libmraa1 libmraa-dev mraa-tools python-mraa python3-mraa 

如何判断库是静态的还是动态的?

1 个答案:

答案 0 :(得分:1)

  

使用以下命令编译程序时,是否链接到静态库或动态库?

请参阅man ld

  

-l namespec

     

- 库= namespec

     

将namespec指定的存档或目标文件添加到要链接的文件列表中。此选项可以使用任意次。如果namespec的格式为:filename,ld将在库路径中搜索名为filename的文件,否则它将在库路径中搜索名为libnamespec.a的文件。

     

在支持共享库的系统上,ld也可以搜索libnamespec.a以外的文件。具体来说,在ELF和SunOS系统上,在搜索名为libnamespec.a的库之前,ld将在目录中搜索名为libnamespec.so的库。 (按照惯例,“。so”扩展名表示共享库。)请注意,此行为不适用于:filename,它始终指定名为filename的文件。

Linux是一个ELF系统。因此,链接器首先搜索.so,然后搜索.a

  

如何判断库是静态的还是动态的?

最重要的可能是.so。您需要查看这些包中包含哪些文件。

您还可以在生成的可执行文件或共享库上调用ldd <executable>,并查看它需要哪些共享库。