Makie/FFMPEG pb libharfbuzz.so.0: undefined symbol: FT_Get_Transform

Hi, I have a bug during animation with CairoMakie. I try the example from the doc:

using CairoMakie

scene = lines(rand(10); linewidth=10)

record(scene, "out.mp4", 1:255; framerate = 60) do i
    scene.plots[2][:color] = RGBf0(i/255, (255 - i)/255, 0) # animate scene
end;

ang get

julia> include("test.jl")
ffmpeg: symbol lookup error: /lib/x86_64-linux-gnu/libharfbuzz.so.0: undefined symbol: FT_Get_Transform
ERROR: UndefVarError: RGBf0 not defined
Stacktrace:
 [1] (::var"#5#6")(i::Int64)
   @ Main ~/temp/testRecord/test.jl:6
 [2] Record(func::var"#5#6", figlike::Makie.FigureAxisPlot, iter::UnitRange{Int64}; kw_args::Base.Pairs{Symbol, Any, Tuple{Symbol, Symbol}, NamedTuple{(:format, :framerate), Tuple{SubString{String}, Int64}}})
   @ Makie ~/.julia/packages/Makie/DekzU/src/recording.jl:167
 [3] record(func::Function, figlike::Makie.FigureAxisPlot, path::String, iter::UnitRange{Int64}; kw_args::Base.Pairs{Symbol, Int64, Tuple{Symbol}, NamedTuple{(:framerate,), Tuple{Int64}}})
   @ Makie ~/.julia/packages/Makie/DekzU/src/recording.jl:148
 [4] top-level scope
   @ ~/temp/testRecord/test.jl:5

julia> 

In case it helps :

julia> versioninfo()
Julia Version 1.8.5
Commit 17cfb8e65ea (2023-01-08 06:45 UTC)
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: 32 Ă— 13th Gen Intel(R) Core(TM) i9-13900K
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-13.0.1 (ORCJIT, goldmont)
  Threads: 8 on 32 virtual cores
Environment:
  JULIA_EDITOR = code
  JULIA_NUM_THREADS = 8

julia> 


(testRecord) pkg> status
Status `~/temp/testRecord/Project.toml`
  [13f3f980] CairoMakie v0.10.5

It is Ubuntu 23.04. FWIW, the same code runs OK on my Mac…

Any hints ?

OK, the former example looks outdated. When I run the following MWE (from the update Makie docs) it runs OK with julia 1.9.0 but has the same issue with Julia 1.8.5

using CairoMakie

time = Observable(0.0)

xs = range(0, 7, length=40)

ys_1 = @lift(sin.(xs .- $time))
ys_2 = @lift(cos.(xs .- $time) .+ 3)

fig = lines(xs, ys_1, color = :blue, linewidth = 4,
    axis = (title = @lift("t = $(round($time, digits = 1))"),))
scatter!(xs, ys_2, color = :red, markersize = 15)

framerate = 30
timestamps = range(0, 2, step=1/framerate)

record(fig, "time_animation.mp4", timestamps;
        framerate = framerate) do t
    time[] = t
end

The problem is that I am using `ParallelStencil.jl which is not yet compatible with Julia 1.9.0…
I am stuck :frowning:

julia> include("observable.jl")
ffmpeg: symbol lookup error: /lib/x86_64-linux-gnu/libharfbuzz.so.0: undefined symbol: FT_Get_Transform
ERROR: IOError: write: broken pipe (EPIPE)

Have you tried in a new and empty project, e.g. Via ]activate --temp?

Hi Simon,

Thank you very much for your answer and for Makie in general !

I just try to run in a temp env with the same result :smiling_face_with_tear:.

results with temp project
laurent@tsi13900k:~/Projects/Acoustic.jl$ julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.8.5 (2023-01-08)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

(@v1.8) pkg> activate --temp
  Activating new project at `/tmp/jl_FO6W7P`

(jl_FO6W7P) pkg> add CairoMakie
    Updating registry at `~/.julia/registries/General.toml`
   Resolving package versions...
   Installed OpenSSL_jll ─ v1.1.21+0
  Downloaded artifact: OpenSSL
    Updating `/tmp/jl_FO6W7P/Project.toml`
  [13f3f980] + CairoMakie v0.10.5
    Updating `/tmp/jl_FO6W7P/Manifest.toml`
  [621f4979] + AbstractFFTs v1.3.1
  [1520ce14] + AbstractTrees v0.4.4
  [79e6a3ab] + Adapt v3.6.2
  [27a7e980] + Animations v0.4.1
  [67c07d97] + Automa v0.8.2
  [13072b0f] + AxisAlgorithms v1.0.1
  [39de3d68] + AxisArrays v0.4.6
  [fa961155] + CEnum v0.4.2
  [159f3aea] + Cairo v1.0.5
  [13f3f980] + CairoMakie v0.10.5
  [49dc2e85] + Calculus v0.5.1
  [d360d2e6] + ChainRulesCore v1.16.0
  [9e997f8a] + ChangesOfVariables v0.1.7
  [a2cac450] + ColorBrewer v0.4.0
  [35d6a980] + ColorSchemes v3.21.0
  [3da002f7] + ColorTypes v0.11.4
  [c3611d14] + ColorVectorSpace v0.9.10
  [5ae59095] + Colors v0.12.10
  [34da2185] + Compat v4.6.1
  [187b0558] + ConstructionBase v1.5.2
  [d38c429a] + Contour v0.6.2
  [9a962f9c] + DataAPI v1.15.0
  [864edb3b] + DataStructures v0.18.13
  [e2d170a0] + DataValueInterfaces v1.0.0
  [b429d917] + DensityInterface v0.4.0
  [31c24e10] + Distributions v0.25.95
  [ffbed154] + DocStringExtensions v0.9.3
  [fa6b7ba4] + DualNumbers v0.6.8
  [411431e0] + Extents v0.1.1
  [c87230d0] + FFMPEG v0.4.1
  [7a1cc6ca] + FFTW v1.6.0
  [5789e2e9] + FileIO v1.16.1
  [1a297f60] + FillArrays v1.1.0
  [53c48c17] + FixedPointNumbers v0.8.4
  [59287772] + Formatting v0.4.2
  [b38be410] + FreeType v4.0.0
  [663a7486] + FreeTypeAbstraction v0.10.0
  [46192b85] + GPUArraysCore v0.1.5
  [cf35fbd7] + GeoInterface v1.3.1
  [5c1252a2] + GeometryBasics v0.4.7
  [a2bd30eb] + Graphics v1.1.2
  [3955a311] + GridLayoutBase v0.9.1
  [42e2da0e] + Grisu v1.0.2
  [34004b35] + HypergeometricFunctions v0.3.16
  [2803e5a7] + ImageAxes v0.6.10
  [c817782e] + ImageBase v0.1.5
  [a09fc81d] + ImageCore v0.9.4
  [82e4d734] + ImageIO v0.6.6
  [bc367c6b] + ImageMetadata v0.9.8
  [9b13fd28] + IndirectArrays v1.0.0
  [d25df0c9] + Inflate v0.1.3
  [a98d9a8b] + Interpolations v0.14.7
  [8197267c] + IntervalSets v0.7.4
  [3587e190] + InverseFunctions v0.1.9
  [92d709cd] + IrrationalConstants v0.2.2
  [f1662d9f] + Isoband v0.1.1
  [c8e1da08] + IterTools v1.4.0
  [82899510] + IteratorInterfaceExtensions v1.0.0
  [692b3bcd] + JLLWrappers v1.4.1
  [682c06a0] + JSON v0.21.4
  [b835a17e] + JpegTurbo v0.1.2
  [5ab0869b] + KernelDensity v0.6.7
  [b964fa9f] + LaTeXStrings v1.3.0
  [8cdb02fc] + LazyModules v0.3.1
  [2ab3a3ac] + LogExpFunctions v0.3.23
  [1914dd2f] + MacroTools v0.5.10
  [ee78f7c6] + Makie v0.19.5
  [20f20a25] + MakieCore v0.6.3
  [dbb5928d] + MappedArrays v0.4.2
  [7eb4fadd] + Match v1.2.0
  [0a4f8689] + MathTeXEngine v0.5.6
  [978d7f02] + MiniQhull v0.4.0
  [e1d29d7a] + Missings v1.1.0
  [e94cdb99] + MosaicViews v0.3.4
  [77ba4419] + NaNMath v1.0.2
  [f09324ee] + Netpbm v1.1.0
  [510215fc] + Observables v0.5.4
  [6fe1bfb0] + OffsetArrays v1.12.9
  [52e1d378] + OpenEXR v0.3.2
  [bac558e1] + OrderedCollections v1.6.0
  [90014a1f] + PDMats v0.11.17
  [f57f5aa1] + PNGFiles v0.3.17
  [19eb6ba3] + Packing v0.5.0
  [5432bcbf] + PaddedViews v0.5.12
  [69de0a69] + Parsers v2.5.10
  [eebad327] + PkgVersion v0.3.2
  [995b91a9] + PlotUtils v1.3.5
  [647866c9] + PolygonOps v0.1.2
  [aea7be01] + PrecompileTools v1.1.1
  [21216c6a] + Preferences v1.4.0
  [92933f4c] + ProgressMeter v1.7.2
  [4b34888f] + QOI v1.0.0
  [1fd47b50] + QuadGK v2.8.2
  [b3c3ace0] + RangeArrays v0.3.2
  [c84ed2f1] + Ratios v0.4.4
  [189a3867] + Reexport v1.2.2
  [05181044] + RelocatableFolders v1.0.0
  [ae029012] + Requires v1.3.0
  [79098fc4] + Rmath v0.7.1
  [fdea26ae] + SIMD v3.4.5
  [7b38b023] + ScanByte v0.3.3
  [6c6a2e73] + Scratch v1.2.0
  [efcf1570] + Setfield v1.1.1
  [992d4aef] + Showoff v1.0.3
  [73760f76] + SignedDistanceFields v0.4.0
  [699a6c99] + SimpleTraits v0.9.4
  [45858cf5] + Sixel v0.1.2
  [a2af1166] + SortingAlgorithms v1.1.0
  [276daf66] + SpecialFunctions v2.2.0
  [c5dd0088] + StableHashTraits v0.3.1
  [cae243ae] + StackViews v0.1.1
  [90137ffa] + StaticArrays v1.5.25
  [1e83bf80] + StaticArraysCore v1.4.0
  [82ae8749] + StatsAPI v1.6.0
⌅ [2913bbd2] + StatsBase v0.33.21
  [4c63d2b9] + StatsFuns v1.3.0
  [09ab397b] + StructArrays v0.6.15
  [3783bdb8] + TableTraits v1.0.1
  [bd369af6] + Tables v1.10.1
  [62fd8b95] + TensorCore v0.1.1
  [731e570b] + TiffImages v0.6.4
  [3bb67fe8] + TranscodingStreams v0.9.13
  [981d1d27] + TriplotBase v0.1.0
  [9d95972d] + TupleTools v1.3.0
  [1cfade01] + UnicodeFun v0.4.1
  [efce3f68] + WoodburyMatrices v0.5.5
  [6e34b625] + Bzip2_jll v1.0.8+0
  [83423d85] + Cairo_jll v1.16.1+1
  [5ae413db] + EarCut_jll v2.2.4+0
  [2e619515] + Expat_jll v2.4.8+0
  [b22a6f82] + FFMPEG_jll v4.4.2+2
  [f5851436] + FFTW_jll v3.3.10+0
  [a3f928ae] + Fontconfig_jll v2.13.93+0
  [d7e528f0] + FreeType2_jll v2.10.4+0
  [559328eb] + FriBidi_jll v1.0.10+0
  [78b55507] + Gettext_jll v0.21.0+0
  [7746bdde] + Glib_jll v2.74.0+2
  [3b182d85] + Graphite2_jll v1.3.14+0
  [2e76f6c2] + HarfBuzz_jll v2.8.1+1
  [905a6f67] + Imath_jll v3.1.7+0
  [1d5cc7b8] + IntelOpenMP_jll v2023.1.0+0
  [aacddb02] + JpegTurbo_jll v2.1.91+0
  [c1c5ebd0] + LAME_jll v3.100.1+0
  [dd4b983a] + LZO_jll v2.10.1+0
⌅ [e9f186c6] + Libffi_jll v3.2.2+1
  [d4300ac3] + Libgcrypt_jll v1.8.7+0
  [7add5ba3] + Libgpg_error_jll v1.42.0+0
  [94ce4f54] + Libiconv_jll v1.16.1+2
  [4b2f31a3] + Libmount_jll v2.35.0+0
  [38a345b3] + Libuuid_jll v2.36.0+0
⌅ [856f044c] + MKL_jll v2022.2.0+0
  [e7412a2a] + Ogg_jll v1.3.5+1
  [18a262bb] + OpenEXR_jll v3.1.4+0
⌅ [458c3c95] + OpenSSL_jll v1.1.21+0
  [efe28fd5] + OpenSpecFun_jll v0.5.5+0
  [91d4177d] + Opus_jll v1.3.2+0
  [36c8627f] + Pango_jll v1.50.9+0
  [30392449] + Pixman_jll v0.40.1+0
  [460c41e3] + QhullMiniWrapper_jll v1.0.0+1
⌅ [784f63db] + Qhull_jll v8.0.1003+0
  [f50d1b31] + Rmath_jll v0.4.0+0
  [02c8fc9c] + XML2_jll v2.10.3+0
  [aed1982a] + XSLT_jll v1.1.34+0
  [4f6342f7] + Xorg_libX11_jll v1.6.9+4
  [0c0b7dd1] + Xorg_libXau_jll v1.0.9+4
  [a3789734] + Xorg_libXdmcp_jll v1.1.3+4
  [1082639a] + Xorg_libXext_jll v1.3.4+4
  [ea2f1a96] + Xorg_libXrender_jll v0.9.10+4
  [14d82f49] + Xorg_libpthread_stubs_jll v0.1.0+3
  [c7cfdc94] + Xorg_libxcb_jll v1.13.0+3
  [c5fb5394] + Xorg_xtrans_jll v1.4.0+3
  [9a68df92] + isoband_jll v0.2.3+0
  [a4ae2306] + libaom_jll v3.4.0+0
  [0ac62f75] + libass_jll v0.15.1+0
  [f638f0a6] + libfdk_aac_jll v2.0.2+0
  [b53b4c65] + libpng_jll v1.6.38+0
  [075b6546] + libsixel_jll v1.10.3+0
  [f27f6e37] + libvorbis_jll v1.3.7+1
  [1270edf5] + x264_jll v2021.5.5+0
  [dfaa095f] + x265_jll v3.5.0+0
  [0dad84c5] + ArgTools v1.1.1
  [56f22d72] + Artifacts
  [2a0f44e3] + Base64
  [8bf52ea8] + CRC32c
  [ade2ca70] + Dates
  [8ba89e20] + Distributed
  [f43a241f] + Downloads v1.6.0
  [7b1f6079] + FileWatching
  [9fa8497b] + Future
  [b77e0a4c] + InteractiveUtils
  [4af54fe1] + LazyArtifacts
  [b27032c2] + LibCURL v0.6.3
  [76f85450] + LibGit2
  [8f399da3] + Libdl
  [37e2e46d] + LinearAlgebra
  [56ddb016] + Logging
  [d6f4376e] + Markdown
  [a63ad114] + Mmap
  [ca575930] + NetworkOptions v1.2.0
  [44cfe95a] + Pkg v1.8.0
  [de0858da] + Printf
  [3fa0cd96] + REPL
  [9a3f8284] + Random
  [ea8e919c] + SHA v0.7.0
  [9e88b42a] + Serialization
  [1a1011a3] + SharedArrays
  [6462fe0b] + Sockets
  [2f01184e] + SparseArrays
  [10745b16] + Statistics
  [4607b0f0] + SuiteSparse
  [fa267f1f] + TOML v1.0.0
  [a4e569a6] + Tar v1.10.1
  [8dfed614] + Test
  [cf7118a7] + UUIDs
  [4ec0a83e] + Unicode
  [e66e0078] + CompilerSupportLibraries_jll v1.0.1+0
  [deac9b47] + LibCURL_jll v7.84.0+0
  [29816b5a] + LibSSH2_jll v1.10.2+0
  [c8ffd9c3] + MbedTLS_jll v2.28.0+0
  [14a3606d] + MozillaCACerts_jll v2022.2.1
  [4536629a] + OpenBLAS_jll v0.3.20+0
  [05823500] + OpenLibm_jll v0.8.1+0
  [efcefdf7] + PCRE2_jll v10.40.0+0
  [83775a58] + Zlib_jll v1.2.12+3
  [8e850b90] + libblastrampoline_jll v5.1.1+0
  [8e850ede] + nghttp2_jll v1.48.0+0
  [3f19e933] + p7zip_jll v17.4.0+0
        Info Packages marked with ⌅ have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`
Precompiling project...
  5 dependencies successfully precompiled in 65 seconds. 183 already precompiled.

julia> pwd()
"/home/laurent/Projects/Acoustic.jl"

julia> include("test.jl")
ffmpeg: symbol lookup error: /lib/x86_64-linux-gnu/libharfbuzz.so.0: undefined symbol: FT_Get_Transform
ERROR: LoadError: IOError: write: broken pipe (EPIPE)
Stacktrace:
  [1] uv_write(s::Base.PipeEndpoint, p::Ptr{UInt8}, n::UInt64)
    @ Base ./stream.jl:1064
  [2] unsafe_write(s::Base.PipeEndpoint, p::Ptr{UInt8}, n::UInt64)
    @ Base ./stream.jl:1118
  [3] unsafe_write
    @ ./io.jl:683 [inlined]
  [4] write
    @ ./io.jl:706 [inlined]
  [5] recordframe!(io::VideoStream)
    @ Makie ~/.julia/packages/Makie/DekzU/src/ffmpeg-util.jl:247
  [6] Record(func::var"#7#8", figlike::Makie.FigureAxisPlot, iter::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}; kw_args::Base.Pairs{Symbol, Any, Tuple{Symbol, Symbol}, NamedTuple{(:format, :framerate), Tuple{SubString{String}, Int64}}})
    @ Makie ~/.julia/packages/Makie/DekzU/src/recording.jl:168
  [7] record(func::Function, figlike::Makie.FigureAxisPlot, path::String, iter::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}; kw_args::Base.Pairs{Symbol, Int64, Tuple{Symbol}, NamedTuple{(:framerate,), Tuple{Int64}}})
    @ Makie ~/.julia/packages/Makie/DekzU/src/recording.jl:148
  [8] top-level scope
    @ ~/Projects/Acoustic.jl/test.jl:17
  [9] include(fname::String)
    @ Base.MainInclude ./client.jl:476
 [10] top-level scope
    @ REPL[4]:1
in expression starting at /home/laurent/Projects/Acoustic.jl/test.jl:17

julia> 

Like I said it works OK with 1.9.0 so I did save my simulation data (that still have to run with 1.8.5) and make the animation in post-treatment with CairoMakie/julia 1.9.0. So I am not stuck anymore. In addition I can enjoy the GLMakie interactive animation with sliders on my local machine :wink:

I’m having the same problem on Manjaro. Has anyone found the issue?

(I also can’t use julia 1.9 yet…)

Nope. I use 1.9.x for Makie visualization and 1.8.5 for computations…

The problem is straight there: somehow you’re using system libraries instead of JLLs. How that happens, I don’t know. Educated guess: you set LD_LIBRARY_PATH to include system libraries. Or something similar.

I am having the same problem on Julia 1.9.x (I tested 1.9.0 and 1.9.2).

Furthermore, I am not aware of changing any ENV variables, and certainly not LD_LIBRARY_PATH.

I tried making temp environment, adding CairoMakie and running an example from docs:

time = Observable(0.0)
color_observable = @lift(RGBf($time, 0, 0))

fig = lines(0..10, sin, color = color_observable)

record(fig, "color_animation_2.mp4", timestamps; framerate = framerate) do t
    time[] = t
end

But still I get the same error:

ffmpeg: symbol lookup error: /lib64/libharfbuzz.so.0: undefined symbol: FT_Get_Transform
ERROR: IOError: write: broken pipe (EPIPE)
Stacktrace:
 [1] uv_write(s::Base.PipeEndpoint, p::Ptr{UInt8}, n::UInt64)
   @ Base ./stream.jl:1066
 [2] unsafe_write(s::Base.PipeEndpoint, p::Ptr{UInt8}, n::UInt64)
   @ Base ./stream.jl:1120
 [3] unsafe_write
   @ ./io.jl:685 [inlined]
 [4] write
   @ ./io.jl:708 [inlined]
 [5] recordframe!(io::VideoStream)
   @ Makie ~/.julia/packages/Makie/iECbF/src/ffmpeg-util.jl:247
 [6] Record(func::var"#87#88", figlike::Makie.FigureAxisPlot, iter::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}; kw_args::Base.Pairs{Symbol, Any, Tuple{Symbol, Symbol}, NamedTuple{(:format, :framerate), Tuple{SubString{String}, Int64}}})
   @ Makie ~/.julia/packages/Makie/iECbF/src/recording.jl:168
 [7] record(func::Function, figlike::Makie.FigureAxisPlot, path::String, iter::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}; kw_args::Base.Pairs{Symbol, Int64, Tuple{Symbol}, NamedTuple{(:framerate,), Tuple{Int64}}})
   @ Makie ~/.julia/packages/Makie/iECbF/src/recording.jl:148
 [8] top-level scope
   ...

Does anyone know what to do with it?

No idea, I did not get the problem with Julia 1.9.x.

What give versioninfo() and Pkg status ?

Hi, thanks for the quick reply!
The output of those commands is here:

(jl_futn5t) pkg> st
Status `/tmp/jl_futn5t/Project.toml`
  [13f3f980] CairoMakie v0.10.6

julia> versioninfo()
Julia Version 1.9.2
Commit e4ee485e909 (2023-07-05 09:39 UTC)
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: 8 Ă— Intel(R) Core(TM) i7-8565U CPU @ 1.80GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-14.0.6 (ORCJIT, skylake)
  Threads: 1 on 8 virtual cores
Environment:
  LD_PRELOAD = /usr/lib64/libstdc++.so.6
  JULIA_EDITOR = code
  JULIA_NUM_THREADS =

I am using a release version of Julia installed via juliaup (but fixing the version to 1.9.0 does nothing)

Well, you are setting an environment variable which affects the dynamic loader. Don’t do that

That’s interesting… If I run julia from the terminal (via e.g. julialauncher), the LD_PRELOAD ENV variable doesn’t showup in the versioninfo() output…

But running in the REPL provided by VS Code, it does

Okay, thanks I managed to find it in the settings.json of VS Code, that LD_PRELOAD was being set as an environment variable for bash…

After removing it, it works like a charm :slight_smile: