Hi, I've been having some trouble running gz-waves on Gazebo Ionic. Plugins are failing to load with an error like this:
[gazebo-1] Error while loading the library [/nix/store/9lig7lxrmddjj5njmnnq1g3gf3r009qr-ros-env/lib/libgz-waves1-hydrodynamics-system.so]: /nix/store/9lig7lxrmddjj5njmnnq1g3gf3r009qr-ros-env/lib/libgz-waves1-hydrodynamics-system.so: undefined symbol: _ZN2gz5waves13HydrodynamicsC1ESt10shared_ptrIKNS0_23HydrodynamicsParametersEES2_IKN4CGAL12Surface_meshINS6_7Point_3INS6_16Simple_cartesianIdEEEEEEES2_IKNS0_16WavefieldSamplerEE
[gazebo-1] (2026-04-12 17:02:01.130) [error] [SystemLoader.cc:169] Failed to load system plugin: (Reason: No plugins detected in library)
[gazebo-1] - Requested plugin name: [gz::sim::systems::Hydrodynamics]
[gazebo-1] - Requested library name: [gz-waves1-hydrodynamics-system]
[gazebo-1] - Resolved library path: [/nix/store/9lig7lxrmddjj5njmnnq1g3gf3r009qr-ros-env/lib/libgz-waves1-hydrodynamics-system.so]
[gazebo-1] (2026-04-12 17:02:01.141) [debug] [CameraZoomPlugin.cc:309] CameraZoomPlugin attached to sensor [camera].
[gazebo-1] (2026-04-12 17:02:01.142) [debug] [CameraZoomPlugin.cc:380] CameraZoomPlugin subscribing to messages on [/model/gimbal/sensor/camera/zoom/cmd_zoom]
[gazebo-1] (2026-04-12 17:02:01.142) [debug] [SystemManager.cc:80] Loaded system [CameraZoomPlugin] for entity [52]
[gazebo-1] (2026-04-12 17:02:01.243) [info] [GstCameraPlugin.cc:127] GstCameraPlugin: attached to sensor [camera]
[gazebo-1] (2026-04-12 17:02:01.243) [info] [GstCameraPlugin.cc:146] GstCameraPlugin: streaming video to 127.0.0.1:5600
[gazebo-1] (2026-04-12 17:02:01.243) [debug] [SystemManager.cc:80] Loaded system [GstCameraPlugin] for entity [52]
[gazebo-1] Error while loading the library [/nix/store/9lig7lxrmddjj5njmnnq1g3gf3r009qr-ros-env/lib/libgz-waves1-waves-visual-system.so]: /nix/store/9lig7lxrmddjj5njmnnq1g3gf3r009qr-ros-env/lib/libgz-waves1-waves-visual-system.so: undefined symbol: _ZNK2gz5waves14WaveParameters9SteepnessEv
[gazebo-1] (2026-04-12 17:02:01.261) [error] [SystemLoader.cc:169] Failed to load system plugin: (Reason: No plugins detected in library)
[gazebo-1] - Requested plugin name: [gz::sim::systems::WavesVisual]
[gazebo-1] - Requested library name: [gz-waves1-waves-visual-system]
[gazebo-1] - Resolved library path: [/nix/store/9lig7lxrmddjj5njmnnq1g3gf3r009qr-ros-env/lib/libgz-waves1-waves-visual-system.so]
I believe this happens because gz-cmake4 introduced a change (gazebosim/gz-cmake#392) that sets -fvisibility=hidden by default. Because of that, libgz-waves1.so no longer exports some needed symbols.
gz-waves built against Gazebo Harmonic (gz-cmake3):
$ readelf -aW ./lib/libgz-waves1.so | grep _ZNK2gz5waves14WaveParameters9SteepnessEv
00000000000f62e0 0000022700000007 R_X86_64_JUMP_SLOT 00000000000b1f60 _ZNK2gz5waves14WaveParameters9SteepnessEv + 0
551: 00000000000b1f60 13 FUNC GLOBAL DEFAULT 14 _ZNK2gz5waves14WaveParameters9SteepnessEv
393: 00000000000b1f60 13 FUNC GLOBAL DEFAULT 14 _ZNK2gz5waves14WaveParameters9SteepnessEv
Gazebo Ionic (gz-cmake4):
$ readelf -aW ./lib/libgz-waves1.so | grep _ZNK2gz5waves14WaveParameters9SteepnessEv
232: 0000000000066ee0 13 FUNC LOCAL DEFAULT 14 _ZNK2gz5waves14WaveParameters9SteepnessEv
As suggested in the gz-cmake pull request, adding "EXPOSE_SYMBOLS_BY_DEFAULT" to gz_configure_build() fixes the issue.
|
gz_configure_build(QUIT_IF_BUILD_ERRORS) |
To reproduce:
// gcc test.c -o test
#include <assert.h>
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
// plugin loading logic copied from gz-plugin
int main(int argc, char *argv[]) {
// need path
assert(argc > 1);
// clear errors
dlerror();
printf("opening %s\n", argv[1]);
void *dlHandle = dlopen(argv[1], RTLD_LAZY | RTLD_LOCAL);
const char *loadError = dlerror();
if(dlHandle == NULL || loadError != NULL) {
printf("load error: %s\n", loadError);
return 1;
}
printf("loaded\n");
}
$ find ./lib -type f -name '*.so.1.0.0' -exec ./test \{\} \;
opening ./lib/libgz-waves1.so.1.0.0
loaded
opening ./lib/libgz-waves1-dynamic-geometry-system.so.1.0.0
loaded
opening ./lib/libgz-waves1-hydrodynamics-system.so.1.0.0
load error: ./lib/libgz-waves1-hydrodynamics-system.so.1.0.0: undefined symbol: _ZN2gz5waves13HydrodynamicsC1ESt10shared_ptrIKNS0_23HydrodynamicsParametersEES2_IKN4CGAL12Surface_meshINS6_7Point_3INS6_16Simple_cartesianIdEEEEEEES2_IKNS0_16WavefieldSamplerEE
opening ./lib/libgz-waves1-rendering.so.1.0.0
loaded
opening ./lib/libgz-waves1-rendering-ogre2.so.1.0.0
load error: ./lib/libgz-waves1-rendering-ogre2.so.1.0.0: undefined symbol: _ZNK2gz5waves10OceanTileTINS_4math2v87Vector3IdEEE3UV0El
opening ./lib/libgz-waves1-waves-visual-system.so.1.0.0
load error: ./lib/libgz-waves1-waves-visual-system.so.1.0.0: undefined symbol: _ZNK2gz5waves14WaveParameters9SteepnessEv
opening ./lib/libgz-waves1-waves-model-system.so.1.0.0
load error: ./lib/libgz-waves1-waves-model-system.so.1.0.0: undefined symbol: _ZN2gz5waves9WavefieldD0Ev
Hi, I've been having some trouble running gz-waves on Gazebo Ionic. Plugins are failing to load with an error like this:
I believe this happens because gz-cmake4 introduced a change (gazebosim/gz-cmake#392) that sets
-fvisibility=hiddenby default. Because of that, libgz-waves1.so no longer exports some needed symbols.gz-waves built against Gazebo Harmonic (gz-cmake3):
Gazebo Ionic (gz-cmake4):
As suggested in the gz-cmake pull request, adding "EXPOSE_SYMBOLS_BY_DEFAULT" to gz_configure_build() fixes the issue.
asv_wave_sim/gz-waves/CMakeLists.txt
Line 295 in ca8629d
To reproduce: