过去,当我非常懒惰(对于Linux和Windows)时,对我有用的是在每个可能的lib路径中大胆使用“grep -r”(即/我知道libs所在的lib,/ lib64,/ usr / lib等),看看我是否可以猜出哪些lib是可能的链接对象,并确保添加“-L”路径和“-l” “lib文件。
对于大多数MSDN记录的库,通常,Microsoft足以指出要链接哪个DLL,但对于Linux来说,它需要更多工作(即我需要在多个站点上使用搜索引擎)。例如,让我们拿ntohl(),MSDN亲切地显示我可以链接的静态.lib和动态.dll文件(知道路径会很好,但我以后可以“找到”)。例如,如果我man 3 ntohl',它可以告诉我最好的是我需要#include arpa/inet.h,但我仍然需要找出(对我来说,grep)哪个lib链接反对(也许ntohl()不是一个很好的例子,因为它通常是libc.so的一部分,但请耐心等待,重点是,我不得不grep发现它在libc.so上。)
问:找到C / C ++库方法的正确(实践)方法是什么,这些方法可以准确地告诉我哪些二进制文件具有我要链接的方法的实现?
注意:请忽略版本(即libc-2.19.so vs libc-xx.so)和arch / target(i386-linux-gnu vs x86_64-linux-gnu),这不如找到正确的版本重要lib文件,它具有链接的实际实现。
答案 0 :(得分:1)
通常,除非另有说明,否则所有函数都来自默认情况下编译器将链接的默认C或C ++库。
否则,期望库函数的手册页将明确指示必须链接非默认库。例如,the manual page for pthread_create(3)告诉您需要与-lpthread
进行关联。
当然,必须依赖提供足够文档的第三方库,或者通过提供传统的手册页,提供这种方式的链接指令,或者通过其他一些文档。通常,图书馆的网站将提供解释如何使用图书馆的文档。
Linux不受强制统一文档要求的单一实体的控制。
答案 1 :(得分:0)
许多软件包使用pkg-config
或他们自己的版本,如mysql_config
。
您可以使用这些工具将标志添加到编译器:
g++ $(pkg-config somelib --cflags) -o prog prog.cpp $(pkg-config somelib --libs)
否则,我使用包管理器来告诉给定包中包含哪些库以及它们的安装位置。
通过pkg-config
使用
pkg-config --list-all
使用man pkg-config
获取更多信息。