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

compiling c++ linking against static or dynamic library

本文关键字:c++ 链接 动态 静态 编译      更新时间:2023-10-16

使用以下命令编译程序时,是针对静态库还是动态库进行链接?

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 

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

当您使用以下命令编译程序时,您是针对静态库还是动态库进行链接?

参见man ld:

-l namespec

--library=namespec

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

在支持共享库的系统上,ld还可以搜索libnamespec.a以外的文件。具体而言,在ELF和SunOS系统上,在搜索libnamesspec.a之前,ld将在目录中搜索libnamespec.so库。(按照惯例,".so"扩展名表示共享库。)请注意,此行为不适用于:filename,它总是指定一个名为filename的文件。

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


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

两者都可以,最有可能是.so。您需要了解哪些文件构成了这些包。

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