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

How does the GNU linker decide what C/C++ library files are needed?

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

MySQL 构建正常(经过一些改进之后),我有一个可以工作的 libmysqlclient.so。但是,PHP7 的 configure 进程在尝试 link MySQL 测试程序时失败,因为 libmysqlclient.so 必须用 C++ 编辑 link标准库,而不是 C 标准库。 (MySQL 显然至少部分是 C++,它使用 std::...stuff...。)Configure 尝试使用 gcc 编译测试程序,其中不包括 C++ 库link,所以测试失败。

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

我突然想到,一定有更好的方法来处理这个问题。似乎 libmysqlclient.so 应该有一些方法告诉 linker 它也需要 libstdc++.so,这样即使 gcc 被用来 link,所有必要的库将被拉入。

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

您几乎不应该尝试手动 link 使用 C++ 标准库。将 g++ 用于 linking C++ 程序。 gcc 知道要使用的库及其所在位置的详细信息,因此您不必知道。

现在的问题是,什么时候用g++,什么时候不用。该问题的一个可能答案是 "always use g++"。它没有坏处。 g++ 可以 link C 程序就好了。生成的程序没有开销。 link 进程本身可能会有一些性能损失,但除了最庞大的程序外,其他任何程序都不会引起注意。