После установки новой машины сборки я узнал, что она шла с 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 не доступны?
Вам не нужно ссылаться на другую библиотеку, вам нужно использовать более старую версию компилятора.
Взгляните на политику 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), и начинайте копать. У меня сработало.
Вы можете отправить необходимые общие библиотеки своими собственными кодом (в подкаталоге) и установите LD_LIBRARY_PATH, в качестве предшественника для запуска вашего приложения, чтобы сначала поиск в этом каталоге.
Доставка конкретной версии, которая вам нужна, будет означать, что она не будет иметь значения, какую версию установлена пользователь. Вам просто нужно убедиться, что вы также отправляете все зависимости.
уже столкнулся с этим. Я не думал о лучшем, чем устанавливать систему (виртуализированное?) С той же конфигурацией, что и целевые машины для создания распределяемых двоичных файлов.
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
, статически ссылка на все вопросы)
PWSTR
- идентификатор из < windows.h >
. Она лучше всего используется при работе с функцией Windows API, которая требует такой функции, и лучше всего избегать ее в противном случае.
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++, которую вы ищете.
Вы пытались просто поместить его в список источников? Это предполагает, что у вас на самом деле есть установлена библиотека!
g++ /usr/lib/libstdc++.so.6.0.8 source1.cpp source2.cpp