将未定义的引用错误限制为仅直接依赖项

Limit undefined reference errors to only direct dependencies

提问人:Saturnu 提问时间:3/1/2019 最后编辑:CommunitySaturnu 更新时间:4/5/2019 访问量:115

问:

我在 Linux 上开发其他人共享的项目并使用 qt creator。

问题是我经常遇到链接错误,特别是因为发生了这种情况:

libA 使用 libB -> libA 必须链接到 libB

libC 使用 libA ->libC 必须同时链接到 libA 和 libB

appZ 使用 libC -> appZ 必须链接到 libC、libA 和 libB

对我来说,理想的情况是,在我的appZ .pro文件中,我必须只写:“链接到libC”,然后它会自动获取其他依赖项。

这是因为经常有人更改其中一个库的依赖项,并且许多难以解决的链接问题来打招呼。

有没有办法将qt creator设置为仅指定最直接的依赖项,如果是,有什么缺点吗?还有其他选择吗?

我正在调查链接标志,但仍然不明白这是否会对我有所帮助。--no-undefined

[编辑]澄清一下,问题是,如果 100 个应用程序使用 libC,如果 libC 或其依赖项之一必须链接到新库,这将成为一个大问题。必须更改所有应用程序,否则它们会出现链接问题。我只是在寻找一种方法来限制这个问题

C++ 共享库 链接器错误 未定义引用

评论


答:

1赞 Abhishek Garg 3/1/2019 #1

良好的链接是一个广泛的主题领域,通常需要大量的时间和经验来理解所有内容。

为了回答您的问题,没有人会在一夜之间更改库或其他文件的依赖项。即使它们发生了变化,它们也会提供以前的版本和新版本,并且它们提供与该库的先前版本的向后兼容性(这意味着旧的 api 将起作用)。如果他们添加了一些新的依赖项以提供新的支持或功能,他们会详细提供您需要哪些新的 so 文件以及如何构建该新库。

在许多情况下,如果您不需要任何新的支持,请使用该库本身的旧版本。但通常新库有一些错误修复,最好选择新版本。

我们使用库来减少工作量,但令人惊讶的是,我们增加了一些工作量来构建第三方库,跟踪这些库中的更改和错误,解决链接错误等。可悲的是,在 Java 或 npm 中处理库并不那么容易。

我所做的是在 Linux 中编写一个脚本来跟踪所有内容。但是这个脚本本身不是自动化的,但它减少了我的大部分工作量。我想你也可以做类似的事情。

澄清一下,问题是,如果 100 个应用程序使用 libC,如果 libC 或其依赖项之一必须链接到新库,这将成为一个大问题。必须更改所有应用程序,否则它们会出现链接问题。我只是在寻找一种方法来限制这个问题

在这种情况下很容易,只需在构建机器中构建新库,并在LD_LIBRARY_PATH中提供文件路径即可。我知道这并不容易,但如前所述,与 Java 或 npm 相比,处理库并不那么容易。您可能还需要对用于维护构建的脚本进行一些编辑。我看不出任何捷径。

评论

0赞 Saturnu 3/1/2019
您好,感谢您的回答。澄清一下,我不是在谈论第三方库。我和朋友有一个由几十个小规模库组成的代码库,由于时间关系,没有人提供向后兼容性等等。我的意思是:如果 A 依赖于 B 和 C,并且 A 被 100 个应用程序使用,如果将 D 添加到 A 中,则必须修改所有 100 个应用程序。
0赞 Abhishek Garg 3/1/2019
好吧,如果你们能把我添加到你的项目中,也许我可以处理它
0赞 Saturnu 3/1/2019
非常感谢您的光临!目前仍未公开,但我们将来会发布它。但是,是的,我正在寻找一些捷径..也许是一些链接器标志或一些已经准备好的脚本来检查 lib 依赖项!
0赞 Abhishek Garg 3/2/2019
兄弟,你必须为此编写自己的脚本@Saturnu
0赞 Saturnu 3/4/2019
是的,我希望已经有一些工具可以减少要编写的脚本数量