有没有办法(在Linux中)确定哪些库必须链接到C/C++程序?即使在程序启动时未检测到未定义符号的情况下,我也不想错过库.另外,我当然希望避免不必要的依赖.
我总体上提出了这个问题,但这里有一个特别的,非常重要的例子:直到最近,我认为我需要链接libpython用于使用Boost.Python开发的Python模块.但是,事实并非如此:使用Boost.Python编写模块; 它甚至可能使用Python C API中的函数,而不仅仅是Boost.Python.链接libboost_python就足够了!这根本不是很明显 - 我至少没有找到它的文档,而且还有Boost.Python模块,它们不必要地链接到libpython.此外,这很难检测,因为libboost_python.so没有将libpython列为依赖报告ldd.(我相信在这个实例中动态加载Python库.)
[ 后来添加:这与Boost.Python无关.此外,如果使用低级Python C API,则可以编译Python模块,而不是与libpython链接,它将起作用.但是,请参阅下面的评论和答案,说明应该链接到libpython.]
那么,我怎么能系统地发现不必要的链接而不是使用反复试验呢?什么是一个很好的通用程序,不仅仅是这个例子?
[ 后来补充:这是我从评论中学到的问题.当我发布这个问题时,下面的事实对我来说并不清楚,所以我现在将它们拼出来,以便将来访问此讨论的人受益,即使这些事情对于有用的评论者来说是显而易见的.(谢谢!)
解析符号在Linux中以传递方式工作(如用户MvG和millimoose所指出的).假设程序A需要解析来自libB和libC的符号.进一步假设一个是对链接libB和libB是对链接的libC.然后一个可以装载即使它没有直接提及执行的libC.
然而,正如评论者指出的那样,依靠这种传递性是不好的做法.对于用C/C++编写的Python模块,这意味着应该链接libpython.对于一般情况下,我们的目标应该不会是确定的链接和执行,为我的一部开拓创新的问题在某种程度上暗示,但真正提供链接必要的库中,以便需要的库的最小列表的所有符号可以解决直接.
总结Salgar的答案,这些信息通常只能从所用库的文档中获得.此外,GCC链接器标志-Wl,--as-needed对于识别真正不必要的库非常有用.
没有办法神奇地知道要包括哪些库,就像没有办法神奇地知道要包括哪些头。
可能有10个不同的库,它们全部具有相同名称的函数,而它们的功能完全不同。由您决定要使用哪一个。
通常情况并非如此,但这只是一个示范点。
通常,如果您使用的是Boost库或其他类似的库,它们的文档将使您知道需要链接到哪个lib。
如上所述,您可以根据需要过度使用和使用标志,但是很多人都有问题,通常在链接到库时,它会在启动时被拉入,并且会从该库中提取所有全局变量被初始化。对于链接器来说,是否需要这些全局变量可能是一件令人困惑的事情。
简而言之,答案通常是阅读文档。或者编译代码并查看遇到的链接器错误,然后从那里开始找出所需的库。