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



我正在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链接,所有必要的库也会被拉入。

有没有办法在libmysqlclient.so中标记依赖项? 还是为了让configure更智能地运行测试程序?

您几乎不应该尝试手动链接到C++标准库。使用 g++ 链接C++程序。GCC 知道要使用的库及其所在位置的微小细节,因此您不必这样做。

现在的问题是,什么时候使用 g++,什么时候不使用。这个问题的一个可能答案是"始终使用 g++"。 它没有害处。g++可以很好地链接C程序。生成的程序中没有开销。链接过程本身可能会有一些性能损失,但对于除了最庞大的程序之外的任何程序来说,它可能不会引起注意。

相关内容

  • 没有找到相关文章

最新更新