скомпилировать приложение C ++ для старой среды Linux - PullRequest
1 голос
/ 08 июля 2019

У меня есть приложение C ++, которое работает на CentOS Linux 6.6, эта машина содержит два GCC с версиями 4.4.7 и 4.9.3.

Я начал использовать Mozilla SpiderMonkey JS engine 60, в котором мне нужно конвертировать некоторые из моих std::string в std::u16string, я использовал способ, который они предоставляют в своих примерах:

static inline std::u16string StringtoU16(const std::string &str) {
    std::u16string wstr = u"";
    char16_t c16str[3] = u"\0";
    mbstate_t mbs;
    for (const auto& it : str) {
        memset(&mbs, 0, sizeof (mbs)); //set shift state to the initial state
        memmove(c16str, u"\0\0\0", 3);
        mbrtoc16(c16str, &it, 3, &mbs);
        wstr.append(std::u16string(c16str));
    }//for
    return wstr;
}

Однако, когда я начал собирать приложение в ранее упомянутой среде, я обнаружил, что <uchar.h> не найден.

Но когда я собрал его на своем компьютере с помощью GCC 6.3.0, код работает нормально.

Я искал другие методы для преобразования Преобразование между строкой, u16string и u32string , но также и на моем компьютере работало нормально, но на компьютере приложения, которое я получил, <codecvt> не найдено.

Я попытался взять вывод сборки приложения на моем ПК (GCC 6.3.0) и запустить его на компьютере приложения (CentOS 6.6), используя следующую процедуру:

  1. Скопировал libstdc ++. So.6.0.22 на машину CentOS
  2. Обновлен LD_LIBRARY_PATH
  3. Запустил приложение

Но я понял, что libstdc ++ нуждается в libc.so.6. Я остановился здесь, потому что, когда я его скопировал, ему нужна другая библиотека.

Итак, что такое решение? Можно ли как-нибудь скомпилировать на моем компьютере и запустить на компьютере приложения?

Ответы [ 2 ]

4 голосов
/ 08 июля 2019

Старые версии GCC на вашем компьютере CentOS не поддерживают функции C ++ 11, которые вы пытаетесь использовать.

Решение, которое я бы порекомендовал, состоит в том, чтобы установить пакет devtoolset-8-gcc-c++ из набора инструментов разработчика в сборниках программного обеспечения (инструкции по его настройке см. В https://www.softwarecollections.org/en/scls/rhscl/devtoolset-7/ - процесс для devtoolset-8-gcc такой же, как и для devtoolset-7-gcc).

Это позволит установить более новый GCC, который можно будет использовать для компиляции кода C ++ 11 на компьютере CentOS, создавая двоичные файлы, которые будут работать на старой системе CentOS, не требуя каких-либо новых библиотек времени выполнения.

0 голосов
/ 08 июля 2019

Другое решение (если Jonathan one не работает) - научиться строить GCC (Gnu Compiler Collection) - несколько компиляторов- и установить из исходного кода .


У меня есть приложение на C ++, которое работает на CentOS Linux 6.6, эта машина содержитдва GCC с версиями 4.4.7 и 4.9.3.

Обратите внимание, что оба GCC 4.4 и 4.9 устарели и не поддерживаются FSF.


Во-первых, успешная сборка GCC из его исходного кода занимает довольно много времени (и несколько гигабайт дискового пространства).Возможно, несколько часов (в основном процессорного) времени на довольно мощном ПК (вам может потребоваться как минимум 32 гигабайта ОЗУ, поскольку прямой (не cross ) компилятор GCC загружен ииспользует LTO ).

Есть плюсы и минусы этого подхода.Профи сразу: после того, как вы узнали, как скомпилировать GCC из его исходного кода, вы можете получить самый последний выпуск ( GCC 9 в июле 2019), как только он будет опубликован,и эта версия, вероятно, будет поддерживать большинство последних стандартов языка C ++ (и несколько новых, таких как Go или D) и все более и более причудливые оптимизации , ориентированные на последние процессоры (возможно, динамически на текущий)).К минусам относится изучение процедуры configuration (довольно сложной, поскольку GCC имеет много настраиваемых функций, сигналов и свистков) и, конечно, ожидание нескольких часов для завершения сборки.

Итак, вынужно сделать компромисс.Готовы ли вы потратить несколько часов на изучение создания GCC или нет.

Конфигурация установленного GCC получается с помощью gcc -v (или gcc-8 -v, если ваш GCC был настроен как gcc-8 ....) и может вдохновить на конфигурацию недавно загруженного GCC.

...