我正在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
在运行测试程序方面变得更聪明?
答案 0 :(得分:5)
实际上,您绝对不应尝试手动链接C ++标准库。使用g ++链接C ++程序。 gcc知道使用哪个库以及它在哪里的详细信息,因此您不必这样做。
现在的问题是,何时使用g ++,何时不使用g ++。该问题的一个可能答案是“始终使用g ++”。没有任何伤害。 g ++可以很好地链接C程序。产生的程序没有任何开销。链接过程本身可能会损失一些性能,但对于最庞大的程序而言,它可能不会引起注意。