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 进程本身可能会有一些性能损失,但除了最庞大的程序外,其他任何程序都不会引起注意。
我正在 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 进程本身可能会有一些性能损失,但除了最庞大的程序外,其他任何程序都不会引起注意。