我正在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程序。生成的程序中没有开销。链接过程本身可能会有一些性能损失,但对于除了最庞大的程序之外的任何程序来说,它可能不会引起注意。