编译针对静态或动态库的C++链接
问题描述:
当您使用以下命令编译程序时,您是针对静态库还是动态库进行链接?编译针对静态或动态库的C++链接
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系统上,ld将在搜索名为libnamespec.so的库之前搜索名为libnamespec.a的库。 (按照惯例,“.so”扩展名表示一个共享库。)请注意,此行为不适用于:filename,它始终指定一个名为filename的文件。
Linux是一个ELF系统。因此,链接器首先搜索.so
,然后搜索.a
。
你怎么能告诉我们,如果库是静态还是动态?
它可以是,胸围最有可能.so
。您需要查看包含这些软件包的文件。
您也可以调用ldd <executable>
生成的可执行文件或共享库,并查看它需要哪些共享库。
非常感谢您的帮助 – scalauser