Как компоновщик GNU решает, какие файлы библиотеки C / C ++ необходимы? - PullRequest
0 голосов
/ 06 января 2019

Я собираю PHP7 на машине OpenWRT (маршрутизатор ARM). Я хотел включить MySQL, поэтому мне тоже пришлось его построить. OpenWRT - это на 99,5% обычный Linux, но есть некоторые странные вещи, связанные со сборкой / разделяемой библиотекой, которые, вероятно, не выполняются часто, поэтому я столкнулся с некоторыми трудностями.

MySQL работает нормально (после некоторого перебора), и у меня есть libmysqlclient.so, который работает. Однако процесс configure для PHP7 завершается неудачно при попытке связать тестовую программу MySQL, поскольку 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 умнее при запуске тестовых программ?

1 Ответ

0 голосов
/ 06 января 2019

Практически никогда не пытайтесь связываться со стандартной библиотекой C ++ вручную. Используйте g ++ для компоновки программ на C ++. gcc знает мельчайшие подробности о том, какую библиотеку использовать и где она находится, так что вам не нужно это делать.

Теперь вопрос в том, когда использовать g ++, а когда нет. Один из возможных ответов на этот вопрос - «всегда используйте g ++». В этом нет никакого вреда. g ++ может связывать программы на C просто отлично. В произведенной программе нет накладных расходов. Может быть некоторая потеря производительности в самом процессе компоновки, но, вероятно, она не будет заметна ни для одной, кроме самой огромной программы.

...