GNU链接器如何确定需要哪些C / C ++库文件?

时间:2019-01-06 17:30:33

标签: c++ c shared-libraries conflicting-libraries

我正在OpenWRT计算机(ARM路由器)上构建PHP7。我想包含MySQL,因此也必须构建它。 OpenWRT是99.5%的普通linux,但是有些奇怪的构建/共享库的东西很可能不经常使用,所以我遇到了一些困难。

MySQL可以正常运行(经过一些修复),并且我有一个libmysqlclient.so可以正常工作。但是,尝试链接MySQL测试程序时,PHP7的configure处理失败,因为libmysqlclient.so必须与C ++标准库而不是C标准库链接。 (MySQL显然至少部分是C ++,并且它使用std::...stuff...。)Configure尝试使用gcc编译测试程序,该程序在链接中不包含C ++库,因此测试失败。

我通过制作一个简单的C / C ++切换脚本来解决这个问题:如果命令行包含-lmysqlclient,则我exec g++ $*否则为exec gcc $*。然后,我告诉configure将脚本用作C编译器。

我想到必须要有更好的方法来解决这个问题。看来libmysqlclient.so应该有某种方式告诉链接器它也需要libstdc++.so,以便即使使用gcc进行链接,所有必需的库也会被引入。 / p>

有什么方法可以标记libmysqlclient.so中的依赖项?还是让configure在运行测试程序方面变得更聪明?

1 个答案:

答案 0 :(得分:5)

实际上,您绝对不应尝试手动链接C ++标准库。使用g ++链接C ++程序。 gcc知道使用哪个库以及它在哪里的详细信息,因此您不必这样做。

现在的问题是,何时使用g ++,何时不使用g ++。该问题的一个可能答案是“始终使用g ++”。没有任何伤害。 g ++可以很好地链接C程序。产生的程序没有任何开销。链接过程本身可能会损失一些性能,但对于最庞大的程序而言,它可能不会引起注意。