Как ограничить gcc определенной средой выполнения ⇐ C++
-
Гость
Как ограничить gcc определенной средой выполнения
У нас есть конвейер CI, в котором создается множество проектов. В одном из проектов используются расширенные возможности C++ (C++20), поэтому мы обновили версию gcc до gcc-9.
Однако у нас есть несколько целевых встраиваемых систем, на которых работает Debian Buster и нет более поздних версий libc. Образы, создаваемые для образа buster, не основаны на C++20, и в их Makefile специально указан std=c++17.
Раньше все эти проекты работали нормально, однако теперь мы получаем такие ошибки:
./project: /usr/lib/arm-linux-gnueabihf/libstdc++.so.6: версия `GLIBCXX_3.4.30' не найдена (требуется ./project) ./project: /usr/lib/arm-linux-gnueabihf/libstdc++.so.6: версия `GLIBCXX_3.4.29' не найдена (требуется ./project) ./project: /usr/lib/arm-linux-gnueabihf/libstdc++.so.6: версия `GLIBCXX_3.4.26' не найдена (требуется ./project) Когда я исследую эти символы, я обнаруживаю, что g++ «ненужно» ссылается на новые версии вещей, которые на самом деле не должны (насколько я могу судить) требовать более новой версии:
objdump -T ./project | grep GLIBCXX_3.4.30 # | awk '{print $5}' | сортировать | уникальный 00000000 DF *UND* 00000000 (GLIBCXX_3.4.30) _ZNSt18condition_variable4waitERSt11unique_lockISt5mutexE objdump -T ./проект | grep GLIBCXX_3.4.29 # | awk '{print $5}' | сортировать | уникальный 00000000 DF *UND* 00000000 (GLIBCXX_3.4.29) _ZSt28__throw_bad_array_new_lengthv Конечно, мне не нужно обновлять buster->bookworm на своих периферийных устройствах, чтобы получить новый улучшенный bad_array_thrower?!
Есть ли способ сообщить gcc, чтобы он не использовал легкомысленно новые символы, если они не реализуют новые функции?
Еще раз: создаваемые проекты не используют C++20, они прекрасно компилируются и работают на gcc-8. Просто новый набор инструментов делает невозможным создание полевых устройств.
У нас есть конвейер CI, в котором создается множество проектов. В одном из проектов используются расширенные возможности C++ (C++20), поэтому мы обновили версию gcc до gcc-9.
Однако у нас есть несколько целевых встраиваемых систем, на которых работает Debian Buster и нет более поздних версий libc. Образы, создаваемые для образа buster, не основаны на C++20, и в их Makefile специально указан std=c++17.
Раньше все эти проекты работали нормально, однако теперь мы получаем такие ошибки:
./project: /usr/lib/arm-linux-gnueabihf/libstdc++.so.6: версия `GLIBCXX_3.4.30' не найдена (требуется ./project) ./project: /usr/lib/arm-linux-gnueabihf/libstdc++.so.6: версия `GLIBCXX_3.4.29' не найдена (требуется ./project) ./project: /usr/lib/arm-linux-gnueabihf/libstdc++.so.6: версия `GLIBCXX_3.4.26' не найдена (требуется ./project) Когда я исследую эти символы, я обнаруживаю, что g++ «ненужно» ссылается на новые версии вещей, которые на самом деле не должны (насколько я могу судить) требовать более новой версии:
objdump -T ./project | grep GLIBCXX_3.4.30 # | awk '{print $5}' | сортировать | уникальный 00000000 DF *UND* 00000000 (GLIBCXX_3.4.30) _ZNSt18condition_variable4waitERSt11unique_lockISt5mutexE objdump -T ./проект | grep GLIBCXX_3.4.29 # | awk '{print $5}' | сортировать | уникальный 00000000 DF *UND* 00000000 (GLIBCXX_3.4.29) _ZSt28__throw_bad_array_new_lengthv Конечно, мне не нужно обновлять buster->bookworm на своих периферийных устройствах, чтобы получить новый улучшенный bad_array_thrower?!
Есть ли способ сообщить gcc, чтобы он не использовал легкомысленно новые символы, если они не реализуют новые функции?
Еще раз: создаваемые проекты не используют C++20, они прекрасно компилируются и работают на gcc-8. Просто новый набор инструментов делает невозможным создание полевых устройств.
Мобильная версия