Skip to content

Missing vec_cvfo symbol on POWER9 when building downstream project with OpenCV 4.x/3.x #27635

@hillwoodroc

Description

@hillwoodroc

System Information

OpenCV version: 4.x / 3.x
Target architecture: ppc64le, POWER9
Compiler: GCC 13.x
Operating system: openSUSE Tumbleweed
VSX enabled: Yes (CV_VSX=ON)
Downstream project: ncnn

Detailed description

OpenCV builds successfully on POWER9 with VSX enabled.
However, when building a downstream project (such as ncnn) that uses OpenCV and links against it, the linker fails due to missing symbols related to vector conversion functions between float and double precision:

undefined reference to vec_cvfo(vector double const&)

This is because in vsx_utils.hpp, the functions:

VSX_REDIRECT_1RG(vec_float4,  vec_double2, vec_cvfo, vec_floate)
VSX_REDIRECT_1RG(vec_double2, vec_float4,  vec_cvfo, vec_doubleo)

are only valid if the underlying architecture supports POWER10-level VSX instructions for float64<->float32 conversion.

POWER9 lacks these instructions, but the macro doesn't guard against this, and there is no fallback definition. As a result, OpenCV compiles fine (no direct call), but consumers that indirectly rely on these intrinsics fail at link time.

Steps to reproduce

  1. Use a POWER9 (ppc64le) system with VSX enabled (e.g., GCC defines VSX)
  2. Build OpenCV 4.12.0 with default options (no error)
  3. Build ncnn with OpenCV support enabled
  4. Error:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp:260:1: error: ‘__builtin_vsx_xvcvdpsp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvdpsp’?
[   74s]   260 | VSX_REDIRECT_1RG(vec_float4,  vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp)
[   74s]       | ^~~~~~~~~~~~~~~~
[   74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_double2 vec_cvfo(const vec_float4&)’:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp:261:1: error: ‘__builtin_vsx_xvcvspdp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvspdp’?
[   74s]   261 | VSX_REDIRECT_1RG(vec_double2, vec_float4,  vec_cvfo, __builtin_vsx_xvcvspdp)
[   74s]       | ^~~~~~~~~~~~~~~~
[   74s] In file included from /usr/include/opencv2/core/base.hpp:705,
[   74s]                  from /usr/include/opencv2/core.hpp:53,
[   74s]                  from /usr/include/opencv2/core/core.hpp:48,
[   74s]                  from /home/abuild/rpmbuild/BUILD/ncnn-20250503-build/ncnn-20250503/examples/squeezenet.cpp:21:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_float4 vec_cvfo(const vec_double2&)’:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp:260:1: error: ‘__builtin_vsx_xvcvdpsp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvdpsp’?
[   74s]   260 | VSX_REDIRECT_1RG(vec_float4,  vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp)
[   74s]       | ^~~~~~~~~~~~~~~~
[   74s] In file included from /usr/include/opencv2/core/base.hpp:705,
[   74s]                  from /usr/include/opencv2/core.hpp:53,
[   74s]                  from /usr/include/opencv2/core/core.hpp:48,
[   74s]                  from /home/abuild/rpmbuild/BUILD/ncnn-20250503-build/ncnn-20250503/examples/yolov3.cpp:20:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_float4 vec_cvfo(const vec_double2&)’:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp:260:1: error: ‘__builtin_vsx_xvcvdpsp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvdpsp’?
[   74s]   260 | VSX_REDIRECT_1RG(vec_float4,  vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp)
[   74s]       | ^~~~~~~~~~~~~~~~
[   74s] In file included from /usr/include/opencv2/core/base.hpp:705,
[   74s]                  from /usr/include/opencv2/core.hpp:53,
[   74s]                  from /usr/include/opencv2/core/core.hpp:48,
[   74s]                  from /home/abuild/rpmbuild/BUILD/ncnn-20250503-build/ncnn-20250503/examples/fasterrcnn.cpp:21:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_float4 vec_cvfo(const vec_double2&)’:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp:260:1: error: ‘__builtin_vsx_xvcvdpsp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvdpsp’?
[   74s]   260 | VSX_REDIRECT_1RG(vec_float4,  vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp)
[   74s]       | ^~~~~~~~~~~~~~~~
[   74s] In file included from /usr/include/opencv2/core/base.hpp:705,
[   74s]                  from /usr/include/opencv2/core.hpp:53,
[   74s]                  from /usr/include/opencv2/core/core.hpp:48,
[   74s]                  from /home/abuild/rpmbuild/BUILD/ncnn-20250503-build/ncnn-20250503/examples/yolov2.cpp:20:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_float4 vec_cvfo(const vec_double2&)’:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp:260:1: error: ‘__builtin_vsx_xvcvdpsp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvdpsp’?
[   74s]   260 | VSX_REDIRECT_1RG(vec_float4,  vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp)
[   74s]       | ^~~~~~~~~~~~~~~~
[   74s] In file included from /usr/include/opencv2/core/base.hpp:705,
[   74s]                  from /usr/include/opencv2/core.hpp:53,
[   74s]                  from /usr/include/opencv2/core/core.hpp:48,
[   74s]                  from /home/abuild/rpmbuild/BUILD/ncnn-20250503-build/ncnn-20250503/examples/rfcn.cpp:21:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_float4 vec_cvfo(const vec_double2&)’:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp:260:1: error: ‘__builtin_vsx_xvcvdpsp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvdpsp’?
[   74s]   260 | VSX_REDIRECT_1RG(vec_float4,  vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp)
[   74s]       | ^~~~~~~~~~~~~~~~
[   74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_double2 vec_cvfo(const vec_float4&)’:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp:261:1: error: ‘__builtin_vsx_xvcvspdp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvspdp’?
[   74s]   261 | VSX_REDIRECT_1RG(vec_double2, vec_float4,  vec_cvfo, __builtin_vsx_xvcvspdp)
[   74s]       | ^~~~~~~~~~~~~~~~
[   74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_double2 vec_cvfo(const vec_float4&)’:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp:261:1: error: ‘__builtin_vsx_xvcvspdp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvspdp’?
[   74s]   261 | VSX_REDIRECT_1RG(vec_double2, vec_float4,  vec_cvfo, __builtin_vsx_xvcvspdp)
[   74s]       | ^~~~~~~~~~~~~~~~
[   74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_double2 vec_cvfo(const vec_float4&)’:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp:261:1: error: ‘__builtin_vsx_xvcvspdp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvspdp’?
[   74s]   261 | VSX_REDIRECT_1RG(vec_double2, vec_float4,  vec_cvfo, __builtin_vsx_xvcvspdp)
[   74s]       | ^~~~~~~~~~~~~~~~
[   74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_double2 vec_cvfo(const vec_float4&)’:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp:261:1: error: ‘__builtin_vsx_xvcvspdp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvspdp’?
[   74s]   261 | VSX_REDIRECT_1RG(vec_double2, vec_float4,  vec_cvfo, __builtin_vsx_xvcvspdp)
[   74s]       | ^~~~~~~~~~~~~~~~
[   74s] In file included from /usr/include/opencv2/core/base.hpp:705,
[   74s]                  from /usr/include/opencv2/core.hpp:53,
[   74s]                  from /usr/include/opencv2/core/core.hpp:48,
[   74s]                  from /home/abuild/rpmbuild/BUILD/ncnn-20250503-build/ncnn-20250503/examples/yolov5.cpp:21:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_float4 vec_cvfo(const vec_double2&)’:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp:260:1: error: ‘__builtin_vsx_xvcvdpsp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvdpsp’?
[   74s]   260 | VSX_REDIRECT_1RG(vec_float4,  vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp)
[   74s]       | ^~~~~~~~~~~~~~~~
[   74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_double2 vec_cvfo(const vec_float4&)’:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp:261:1: error: ‘__builtin_vsx_xvcvspdp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvspdp’?
[   74s]   261 | VSX_REDIRECT_1RG(vec_double2, vec_float4,  vec_cvfo, __builtin_vsx_xvcvspdp)
[   74s]       | ^~~~~~~~~~~~~~~~
[   74s] /usr/include/opencv2/core/vsx_utils.hpp: In function ‘vec_double2 vec_cvfo(const vec_float4&)’:
[   74s] /usr/include/opencv2/core/vsx_utils.hpp:261:1: error: ‘__builtin_vsx_xvcvspdp’ was not declared in this scope; did you mean ‘__builtin_vsx_xscvspdp’?
[   74s]   261 | VSX_REDIRECT_1RG(vec_double2, vec_float4,  vec_cvfo, __builtin_vsx_xvcvspdp)

Suggested Fix

#27633

Issue submission checklist

  • I report the issue, it's not a question
  • I checked the problem with documentation, FAQ, open issues, forum.opencv.org, Stack Overflow, etc and have not found any solution
  • I updated to the latest OpenCV version and the issue is still there
  • There is reproducer code and related data files (videos, images, onnx, etc)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions