Ссылка с более старой версией libstdc ++

После установки новой машины сборки я узнал, что она шла с 6.0.10 из стандартной библиотеки C++

-rw-r--r--  1 root root 1019216 2009-01-02 12:15 libstdc++.so.6.0.10

Многие наши целевые машины, однако, все еще используют более старую версию libstdc ++, например:

-rwxr-xr-x 1 root root  985888 Aug 19 21:14 libstdc++.so.6.0.8

По-видимому, ABI, измененный в тех последних двух 0.0.1's, как пытающийся запустить программу, приводит к

/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found

Я пытался явно установить более старую версию gcc, но это не помогло. Обновление целевых машин находится вне моего контроля, таким образом, не опция. Что лучший способ состоит в том, чтобы заставить мои сборки работать над машинами с более старым libstdc ++?

Я искал в способном кэше более старый libstdc ++ версии для установки, но по-видимому никакие более старые версии 6 не доступны?

28
задан Pieter 25 October 2010 в 15:09
поделиться

6 ответов

Вам не нужно ссылаться на другую библиотеку, вам нужно использовать более старую версию компилятора.

Взгляните на политику GNU ABI. Общая библиотека libstdc++ разработана для прямой совместимости. То есть версию 6.0.10 можно использовать, если вам нужна 6.0.8. В политике вы можете прочитать, что начиная с gcc-4.2.0 требуется 6.0.9, поэтому вам нужен gcc-4.1.x.

Короче говоря, поэтому в вашей системе есть только одна libstdc++.so.6.0.x, вам нужна только последняя.

Что касается настройки системы сборки на использование только определенной версии компилятора: убедитесь, что стандартный g++ не может быть использован (переименуйте ссылку, удалите пакет, предоставляющий его, уберите его из PATH), и начинайте копать. У меня сработало.

20
ответ дан 28 November 2019 в 03:43
поделиться

Вы можете отправить необходимые общие библиотеки своими собственными кодом (в подкаталоге) и установите LD_LIBRARY_PATH, в качестве предшественника для запуска вашего приложения, чтобы сначала поиск в этом каталоге.

Доставка конкретной версии, которая вам нужна, будет означать, что она не будет иметь значения, какую версию установлена ​​пользователь. Вам просто нужно убедиться, что вы также отправляете все зависимости.

7
ответ дан 28 November 2019 в 03:43
поделиться

уже столкнулся с этим. Я не думал о лучшем, чем устанавливать систему (виртуализированное?) С той же конфигурацией, что и целевые машины для создания распределяемых двоичных файлов.

2
ответ дан 28 November 2019 в 03:43
поделиться

Al Альтернативы, которые не работали для меня, но, возможно, кто-то еще найдет его полезным, - это статически ссылку Libgcc и libstdc ++.

GCC имеет вариант -Static-Libgcc , но просто используя эту опцию ничего не достигает, так как LibStdc ++ все еще динамически связан. Но, убедившись, что GCC может найти только статическую версию libstdc ++, может быть достигнуто статическое соединение.

ln -s `g++ -print-file-name=libstdc++.a`
g++ -static-libgcc -L. source.cpp

Проблема в том, что библиотеки Boost были построены против более нового libstdc ++, поэтому, в то время как программа правильно компилирует, она генерирует ошибки времени выполнения ...

Может быть, это разрешимо, если я восстановит повышение, еще не пробовал.

(Для записи, если вы используете любой код, который динамически загружает библиотеки, через E.G. DLOPEN , статически ссылка на все вопросы)

2
ответ дан 28 November 2019 в 03:43
поделиться

PWSTR - идентификатор из < windows.h > . Она лучше всего используется при работе с функцией Windows API, которая требует такой функции, и лучше всего избегать ее в противном случае.

-121--3879796-

OK, вопрос теперь включает список пожеланий API...; -)

Вы можете использовать JLayer для MP3 воспроизведения на JVM. На Ubuntu он упакован как libjlayer-java. Здесь представлен простой пример использования Java . Обертка Clojure:

(defn play-file [filename & opts]
  (let [fis (java.io.FileInputStream. filename)
        bis (java.io.BufferedInputStream. fis)
        player (javazoom.jl.player.Player. bis)]
    (if-let [synchronously (first opts)]
      (doto player
        (.play)
        (.close))
      (.start (Thread. #(doto player (.play) (.close)))))))

Используйте (play-file «/path/to/file.mp3 ») , чтобы воспроизвести mp3-муху в отдельном потоке, (play-file «/path/to/file.mp3» true) , если вы предпочитаете воспроизвести ее на Поправь по душе. Поставьте свой собственный громкий гудок и лай собака mp3.; -)

Для нагрузки гудок и тому подобное, вы также можете использовать МИДИ... Возможно, эта запись в блоге будет полезна, если вы решите попробовать.

Кроме того, ссылка из моего первоначального ответа может быть полезна при настройке Java Sound Resources: Ссылки .

-121--3375352-

Вы можете либо «провезти» новые libstdc++ в клиентские системы (в частную область) и связать программы с соответствующими -rpath , либо получить более старую версию libstdc++ на вашем компьютере. Не похоже, что вам нужно обновление, и это может быть не под вопросом по другим причинам.

Примечание: на FreeBSD libstdc++ соединяется с компилятором (у меня установлены gcc4.2, 4.4 и 4.5, каждый с собственной libstc++). Попробуйте установить более старую (соответствующую клиентским системам) версию gcc, которая может содержать более старую libstdc++, которую вы ищете.

1
ответ дан 28 November 2019 в 03:43
поделиться

Вы пытались просто поместить его в список источников? Это предполагает, что у вас на самом деле есть установлена ​​библиотека!

g++ /usr/lib/libstdc++.so.6.0.8 source1.cpp source2.cpp
0
ответ дан 28 November 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: