microsoft / vcpkg

C++ Library Manager for Windows, Linux, and MacOS
MIT License
22.2k stars 6.16k forks source link

[devil] build failure on mac os arm64 #38559

Open chicoferreira opened 2 months ago

chicoferreira commented 2 months ago

Operating system

MacOS (ARM)

Compiler

Clang

Steps to reproduce the behavior

Add devil as a dependency to vcpkg.json.

Add the following to CMakeLists.txt:

find_package(DevIL REQUIRED)
target_link_libraries(test PRIVATE DevIL:IL)

Include the file on main.cpp and call some function:

#include "il.h"

int main() {
    ilInit();
    return 0;
}

Compile and run with CMake.

Failure logs

Undefined symbols for architecture arm64:
  "_TIFFClientOpen", referenced from:
      iTIFFOpen(char*) in libIL.a[71](il_tiff.cpp.o)
      iTIFFOpen(char*) in libIL.a[71](il_tiff.cpp.o)
  "_TIFFClose", referenced from:
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      ...
  "_TIFFComputeStrip", referenced from:
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
  "_TIFFGetField", referenced from:
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      ...
  "_TIFFGetFieldDefaulted", referenced from:
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      ...
  "_TIFFReadDirectory", referenced from:
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
  "_TIFFReadEncodedStrip", referenced from:
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
  "_TIFFReadRGBAImage", referenced from:
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
  "_TIFFScanlineSize", referenced from:
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
  "_TIFFSetDirectory", referenced from:
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
  "_TIFFSetErrorHandler", referenced from:
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
  "_TIFFSetField", referenced from:
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      ...
  "_TIFFSetWarningHandler", referenced from:
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
  "_TIFFStripSize", referenced from:
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
      iLoadTiffInternal() in libIL.a[71](il_tiff.cpp.o)
  "_TIFFWriteScanline", referenced from:
      iSaveTiffInternal() in libIL.a[71](il_tiff.cpp.o)
  "_jas_free", referenced from:
      jas_stream_destroy(jas_stream_t*) in libIL.a[35](il_jp2.cpp.o)
      jas_stream_destroy(jas_stream_t*) in libIL.a[35](il_jp2.cpp.o)
  "_jas_image_create", referenced from:
      iSaveJp2Internal() in libIL.a[35](il_jp2.cpp.o)
  "_jas_image_decode", referenced from:
      iLoadJp2Internal(jas_stream_t*, ILimage*) in libIL.a[35](il_jp2.cpp.o)
  "_jas_image_destroy", referenced from:
      iLoadJp2Internal(jas_stream_t*, ILimage*) in libIL.a[35](il_jp2.cpp.o)
      iLoadJp2Internal(jas_stream_t*, ILimage*) in libIL.a[35](il_jp2.cpp.o)
      iLoadJp2Internal(jas_stream_t*, ILimage*) in libIL.a[35](il_jp2.cpp.o)
      iSaveJp2Internal() in libIL.a[35](il_jp2.cpp.o)
      iSaveJp2Internal() in libIL.a[35](il_jp2.cpp.o)
      iSaveJp2Internal() in libIL.a[35](il_jp2.cpp.o)
      iSaveJp2Internal() in libIL.a[35](il_jp2.cpp.o)
      ...
  "_jas_image_encode", referenced from:
      iSaveJp2Internal() in libIL.a[35](il_jp2.cpp.o)
  "_jas_image_readcmpt", referenced from:
      iLoadJp2Internal(jas_stream_t*, ILimage*) in libIL.a[35](il_jp2.cpp.o)
  "_jas_image_strtofmt", referenced from:
      iSaveJp2Internal() in libIL.a[35](il_jp2.cpp.o)
  "_jas_image_writecmpt", referenced from:
      Jp2ConvertData(jas_stream_t*, jas_image_t*) in libIL.a[35](il_jp2.cpp.o)
  "_jas_init", referenced from:
      _ilLoadJp2F in libIL.a[35](il_jp2.cpp.o)
      _ilLoadJp2LInternal in libIL.a[35](il_jp2.cpp.o)
      iSaveJp2Internal() in libIL.a[35](il_jp2.cpp.o)
  "_jas_malloc", referenced from:
      iJp2ReadStream() in libIL.a[35](il_jp2.cpp.o)
      jas_stream_create() in libIL.a[35](il_jp2.cpp.o)
      jas_stream_initbuf(jas_stream_t*, int) in libIL.a[35](il_jp2.cpp.o)
      iJp2WriteStream() in libIL.a[35](il_jp2.cpp.o)
  "_jas_matrix_create", referenced from:
      iLoadJp2Internal(jas_stream_t*, ILimage*) in libIL.a[35](il_jp2.cpp.o)
      Jp2ConvertData(jas_stream_t*, jas_image_t*) in libIL.a[35](il_jp2.cpp.o)
  "_jas_matrix_destroy", referenced from:
      iLoadJp2Internal(jas_stream_t*, ILimage*) in libIL.a[35](il_jp2.cpp.o)
      Jp2ConvertData(jas_stream_t*, jas_image_t*) in libIL.a[35](il_jp2.cpp.o)
  "_jas_stream_close", referenced from:
      _ilLoadJp2F in libIL.a[35](il_jp2.cpp.o)
      iLoadJp2Internal(jas_stream_t*, ILimage*) in libIL.a[35](il_jp2.cpp.o)
      _ilLoadJp2LInternal in libIL.a[35](il_jp2.cpp.o)
      iSaveJp2Internal() in libIL.a[35](il_jp2.cpp.o)
      iSaveJp2Internal() in libIL.a[35](il_jp2.cpp.o)
      iSaveJp2Internal() in libIL.a[35](il_jp2.cpp.o)
      iSaveJp2Internal() in libIL.a[35](il_jp2.cpp.o)
      iSaveJp2Internal() in libIL.a[35](il_jp2.cpp.o)
      ...
  "_jas_stream_flush", referenced from:
      iSaveJp2Internal() in libIL.a[35](il_jp2.cpp.o)
      Jp2ConvertData(jas_stream_t*, jas_image_t*) in libIL.a[35](il_jp2.cpp.o)
  "_jas_stream_getc_func", referenced from:
      Jp2ConvertData(jas_stream_t*, jas_image_t*) in libIL.a[35](il_jp2.cpp.o)
  "_jas_stream_memopen", referenced from:
      _ilLoadJp2LInternal in libIL.a[35](il_jp2.cpp.o)
      iSaveJp2Internal() in libIL.a[35](il_jp2.cpp.o)
  "_jpeg_CreateCompress", referenced from:
      iSaveJpegInternal() in libIL.a[36](il_jpeg.cpp.o)
  "_jpeg_CreateDecompress", referenced from:
      iLoadJpegInternal() in libIL.a[36](il_jpeg.cpp.o)
  "_jpeg_destroy", referenced from:
      iJpegErrorExit(jpeg_common_struct*) in libIL.a[36](il_jpeg.cpp.o)
  "_jpeg_destroy_compress", referenced from:
      iSaveJpegInternal() in libIL.a[36](il_jpeg.cpp.o)
  "_jpeg_destroy_decompress", referenced from:
      iLoadJpegInternal() in libIL.a[36](il_jpeg.cpp.o)
      iLoadJpegInternal() in libIL.a[36](il_jpeg.cpp.o)
  "_jpeg_finish_compress", referenced from:
      iSaveJpegInternal() in libIL.a[36](il_jpeg.cpp.o)
  "_jpeg_finish_decompress", referenced from:
      iLoadJpegInternal() in libIL.a[36](il_jpeg.cpp.o)
  "_jpeg_read_header", referenced from:
      iLoadJpegInternal() in libIL.a[36](il_jpeg.cpp.o)
  "_jpeg_read_scanlines", referenced from:
      ilLoadFromJpegStruct(void*) in libIL.a[36](il_jpeg.cpp.o)
  "_jpeg_resync_to_restart", referenced from:
      devil_jpeg_read_init(jpeg_decompress_struct*) in libIL.a[36](il_jpeg.cpp.o)
  "_jpeg_set_defaults", referenced from:
      iSaveJpegInternal() in libIL.a[36](il_jpeg.cpp.o)
  "_jpeg_set_quality", referenced from:
      iSaveJpegInternal() in libIL.a[36](il_jpeg.cpp.o)
  "_jpeg_simple_progression", referenced from:
      iSaveJpegInternal() in libIL.a[36](il_jpeg.cpp.o)
  "_jpeg_start_compress", referenced from:
      iSaveJpegInternal() in libIL.a[36](il_jpeg.cpp.o)
      ilSaveFromJpegStruct(void*) in libIL.a[36](il_jpeg.cpp.o)
  "_jpeg_start_decompress", referenced from:
      ilLoadFromJpegStruct(void*) in libIL.a[36](il_jpeg.cpp.o)
  "_jpeg_std_error", referenced from:
      iLoadJpegInternal() in libIL.a[36](il_jpeg.cpp.o)
      iSaveJpegInternal() in libIL.a[36](il_jpeg.cpp.o)
  "_jpeg_write_scanlines", referenced from:
      iSaveJpegInternal() in libIL.a[36](il_jpeg.cpp.o)
      ilSaveFromJpegStruct(void*) in libIL.a[36](il_jpeg.cpp.o)
  "_png_create_info_struct", referenced from:
      readpng_init() in libIL.a[51](il_png.cpp.o)
      iSavePngInternal() in libIL.a[51](il_png.cpp.o)
  "_png_create_read_struct", referenced from:
      readpng_init() in libIL.a[51](il_png.cpp.o)
  "_png_create_write_struct", referenced from:
      iSavePngInternal() in libIL.a[51](il_png.cpp.o)
  "_png_destroy_read_struct", referenced from:
      readpng_init() in libIL.a[51](il_png.cpp.o)
      readpng_init() in libIL.a[51](il_png.cpp.o)
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
      ...
  "_png_destroy_write_struct", referenced from:
      iSavePngInternal() in libIL.a[51](il_png.cpp.o)
      iSavePngInternal() in libIL.a[51](il_png.cpp.o)
      iSavePngInternal() in libIL.a[51](il_png.cpp.o)
  "_png_get_IHDR", referenced from:
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
  "_png_get_PLTE", referenced from:
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
  "_png_get_channels", referenced from:
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
  "_png_get_color_type", referenced from:
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
  "_png_get_tRNS", referenced from:
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
  "_png_get_valid", referenced from:
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
  "_png_read_image", referenced from:
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
  "_png_read_info", referenced from:
      readpng_init() in libIL.a[51](il_png.cpp.o)
  "_png_read_update_info", referenced from:
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
  "_png_set_IHDR", referenced from:
      iSavePngInternal() in libIL.a[51](il_png.cpp.o)
      iSavePngInternal() in libIL.a[51](il_png.cpp.o)
  "_png_set_PLTE", referenced from:
      iSavePngInternal() in libIL.a[51](il_png.cpp.o)
  "_png_set_bgr", referenced from:
      iSavePngInternal() in libIL.a[51](il_png.cpp.o)
  "_png_set_error_fn", referenced from:
      readpng_init() in libIL.a[51](il_png.cpp.o)
  "_png_set_expand_gray_1_2_4_to_8", referenced from:
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
  "_png_set_longjmp_fn", referenced from:
      readpng_init() in libIL.a[51](il_png.cpp.o)
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
      png_error_func(png_struct_def*, char const*) in libIL.a[51](il_png.cpp.o)
  "_png_set_packing", referenced from:
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
  "_png_set_read_fn", referenced from:
      readpng_init() in libIL.a[51](il_png.cpp.o)
  "_png_set_swap", referenced from:
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
      iSavePngInternal() in libIL.a[51](il_png.cpp.o)
  "_png_set_tRNS", referenced from:
      iSavePngInternal() in libIL.a[51](il_png.cpp.o)
  "_png_set_tRNS_to_alpha", referenced from:
      readpng_get_image(double) in libIL.a[51](il_png.cpp.o)
  "_png_set_text", referenced from:
      iSavePngInternal() in libIL.a[51](il_png.cpp.o)
  "_png_set_write_fn", referenced from:
      iSavePngInternal() in libIL.a[51](il_png.cpp.o)
  "_png_sig_cmp", referenced from:
      iIsValidPng() in libIL.a[51](il_png.cpp.o)
  "_png_write_end", referenced from:
      iSavePngInternal() in libIL.a[51](il_png.cpp.o)
  "_png_write_image", referenced from:
      iSavePngInternal() in libIL.a[51](il_png.cpp.o)
  "_png_write_info", referenced from:
      iSavePngInternal() in libIL.a[51](il_png.cpp.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

Additional context

Removing "devil" as a dependency from vcpkg.json solves the issue, but then can't compile on Windows.

JonLiu1993 commented 2 months ago

@chicoferreira, Thanks for posting this issue, devil not provide find_package() usage, just provide pkg-config modules:

-- Fixing pkgconfig file: /Users/vcpkg/Jon/vcpkg/packages/devil_arm64-osx/lib/pkgconfig/IL.pc
-- Fixing pkgconfig file: /Users/vcpkg/Jon/vcpkg/packages/devil_arm64-osx/lib/pkgconfig/ILU.pc
-- Fixing pkgconfig file: /Users/vcpkg/Jon/vcpkg/packages/devil_arm64-osx/lib/pkgconfig/ILUT.pc
-- Fixing pkgconfig file: /Users/vcpkg/Jon/vcpkg/packages/devil_arm64-osx/debug/lib/pkgconfig/IL.pc
-- Fixing pkgconfig file: /Users/vcpkg/Jon/vcpkg/packages/devil_arm64-osx/debug/lib/pkgconfig/ILU.pc
-- Fixing pkgconfig file: /Users/vcpkg/Jon/vcpkg/packages/devil_arm64-osx/debug/lib/pkgconfig/ILUT.pc
-- Installing: /Users/vcpkg/Jon/vcpkg/packages/devil_arm64-osx/share/devil/copyright
-- Performing post-build validation
Elapsed time to handle devil:arm64-osx: 6.6 s
Total install time: 1.1 min
devil provides pkg-config modules:

    # Developer's Image Library - IL part (just image load/save)
    IL

    # Developer's Image Library - ILU part (image library utilities)
    ILU

    # Developer's Image Library - ILUT part (connection to higher level libraries)
    ILUT
chicoferreira commented 2 months ago

How can I then use it both on Windows, Linux and MacOS with the same vcpkg.json and CMakeLists.txt? The compilation works on Windows without needing to link .dll's but fails on Linux and Mac OS.

dg0yt commented 2 months ago

The default linux and osx triplets use static library linkage, the default windows triplet uses dynamic library linkage. I guess this explains the different observations.

chicoferreira commented 2 months ago

I was expecting that vcpkg would abstract that and just link the package correctly in any supported OS, which it doesn't, or at least tell me how to do it like other packages do.

@JonLiu1993 as this issue is no longer marked as a bug, could you please tell me how could I do https://github.com/microsoft/vcpkg/issues/38559#issuecomment-2097938466? Thank you for the support.

Osyotr commented 1 month ago

Option 1: use triplets with dynamic linkage (e.g. x64-linux-dynamic or arm64-osx-dynamic or x64-windows). Option 2: instead of using find_package(DevIL REQUIRED) use pkg-config:

find_package(PkgConfig REQUIRED)
pkg_check_modules(DevIL REQUIRED IMPORTED_TARGET DevIL)
target_link_libraries(my_target PRIVATE PkgConfig::DevIL)

(Note that it's still possible that pkg-config files installed by devil don't express transitive dependencies properly. You may also need to add pkgconf to your dependencies list on windows.) Option 3: write vcpkg-cmake-wrapper.cmake for the port. Port tiff does something similar.

dg0yt commented 1 month ago

Option 3: write vcpkg-cmake-wrapper.cmake for the port. Port tiff does something similar.

~No wrapper please. Only CMake config.~ Sorry, yes. Wrap the official cmake module.

chicoferreira commented 1 month ago

Thank you for the options given. Unfortunately they didn't fit my needs so I end up switch from devil to stb which gives me the same features I needed.

dg0yt commented 1 month ago

Please re-open. This need a fix.