5. March 2024

Linking of application failed with: can’t link soft-float modules with single-float modules

When building an application for RISC-V you may get following linking error:

can't link soft-float modules with single-float modules

The problem is that ABI of the library does not match the application. You can use following command to check flags:

readelf -h path_to_library
...
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              REL (Relocatable file)
  Machine:                           RISC-V
  Version:                           0x1
  Entry point address:               0x0
  Start of program headers:          0 (bytes into file)
  Start of section headers:          736 (bytes into file)
  Flags:                             0x1, RVC, soft-float ABI

The solution is to build the library with the same flags like the rest of application. This can be achieved by using following flags for CMake.

-DCMAKE_C_FLAGS=-march=rv32imafc -mabi=ilp32f
-DCMAKE_CXX_FLAGS=-march=rv32imafc -mabi=ilp32f

If your target has different support for float, you might need to change suggested march and mabi.

12. February 2018

Incompatible library version: requires version 19.0.0 or later, but .dylib provides version 18.0.0

I was trying to compile simple test application with FreeType2 on macOS just by a command line. Application compiled without problem.

The application was not able to start and displayed following error:

Compilation of FreeType
dyld: Library not loaded: /usr/local/lib/libfreetype.6.dylib
  Referenced from: /Users/georgik/projects/freetype-2.6.5/./fttest
  Reason: Incompatible library version: fttest requires version 19.0.0 or later, but libfreetype.6.dylib provides version 18.0.0

There is one handy tool on macOS which helps in cases like this one: otool.

otool -L ./ft-test
./fttest:
  /usr/local/lib/libfreetype.6.dylib (compatibility version 19.0.0, current version 19.5.0)
  /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)
  /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 495.0.0

The problem was caused by two versions of libfreetype on the macOS. One library was stored in /usr/local/lib and the other was stored in my project directory.

How to fix the issue? There are two options:

  • Remove unwanted library which is causing ambiguity
  • Set proper paths to DYLD_LIBRARY_PATH before starting the application

22. October 2017

SDL2_image for iOS with JPEG image format

Adding SDL2_image with JPEG support for iOS is a little bit different than for Android. In case of Android, it was necessary to add JPEG library in C and build it. iOS has JPEG dependency hidden in another library which is already compiled in frameworks.

If you just add SDL2_image to your project for iOS, you will very likely end up with following linker error:

"_kUTTypeJPEG", referenced from ...
Linker command failed with exit code 1

To resolve this issue, it is sufficient to add two dependencies into your project.

Go to Project and select Build Phases.

In the section Linking add library: ImageIO.framework

Then add the second dependency: MobileCoreServices.framework

Then Clean and Build the project.

These steps should resolve the linker issue, and JPEG should work.