microsoft / vcpkg

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

libjxl: `find_library` imports unusable library with `x64-windows-static` triplet #34330

Open HappySeaFox opened 11 months ago

HappySeaFox commented 11 months ago

Describe the bug

Install libjxl with x64-windows-static triplet:

vcpkg install libjxl --triplet x64-windows-static

Client application:

CMakeLists.txt:

cmake_minimum_required(VERSION 3.13)

project(libjxl-test)

add_executable(libjxl-test main.c)

find_library(JXL_LIBRARY NAMES jxl jxl-static REQUIRED)
find_path(JXL_INCLUDE_DIRS jxl/decode.h REQUIRED)

target_include_directories(libjxl-test PRIVATE ${JXL_INCLUDE_DIRS})
target_link_libraries(libjxl-test PRIVATE ${JXL_LIBRARY})

main.c:

#include <jxl/decode.h>

int main(int argc, char *argv[])
{
    JxlDecoder *decoder = JxlDecoderCreate(NULL);

    return 0;
}

Environment

Result:

main.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp_JxlDecoderCreate в функции main.
[F:\projects\git.libjxl.vcpkg-test\build\libjxl-test.vcxproj]
F:\projects\git.libjxl.vcpkg-test\build\Release\libjxl-test.exe : fatal error LNK1120: неразрешенных вне
шних элементов: 1 [F:\projects\git.libjxl.vcpkg-test\build\libjxl-test.vcxproj]

LNK2019 = unresolved external symbol

Compilation Log Microsoft (R) Build Engine версии 16.11.2+f32259642 для .NET Framework (C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены. Поиск библиотек Поиск F:\projects\git.vcpkg\installed\x64-windows-static\lib\jxl-static.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\kernel32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\user32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\gdi32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\winspool.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\shell32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\ole32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\oleaut32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\uuid.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\comdlg32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\advapi32.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\MSVCRT.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\OLDNAMES.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\vcruntime.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64\ucrt.lib: Поиск F:\projects\git.vcpkg\installed\x64-windows-static\lib\jxl-static.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\kernel32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\user32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\gdi32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\winspool.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\shell32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\ole32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\oleaut32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\uuid.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\comdlg32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\advapi32.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\MSVCRT.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\OLDNAMES.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\vcruntime.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64\ucrt.lib: Поиск F:\projects\git.vcpkg\installed\x64-windows-static\lib\jxl-static.lib: Поиск библиотек завершен Поиск библиотек Поиск F:\projects\git.vcpkg\installed\x64-windows-static\lib\jxl-static.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\kernel32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\user32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\gdi32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\winspool.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\shell32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\ole32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\oleaut32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\uuid.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\comdlg32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\advapi32.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\MSVCRT.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\OLDNAMES.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\vcruntime.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64\ucrt.lib: Поиск библиотек завершен Поиск библиотек Поиск F:\projects\git.vcpkg\installed\x64-windows-static\lib\jxl-static.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\kernel32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\user32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\gdi32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\winspool.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\shell32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\ole32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\oleaut32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\uuid.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\comdlg32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\advapi32.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\MSVCRT.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\OLDNAMES.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\vcruntime.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64\ucrt.lib: Поиск библиотек завершен Поиск библиотек Поиск F:\projects\git.vcpkg\installed\x64-windows-static\lib\jxl-static.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\kernel32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\user32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\gdi32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\winspool.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\shell32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\ole32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\oleaut32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\uuid.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\comdlg32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\advapi32.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\MSVCRT.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\OLDNAMES.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\vcruntime.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64\ucrt.lib: Поиск библиотек завершен Поиск библиотек Поиск F:\projects\git.vcpkg\installed\x64-windows-static\lib\jxl-static.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\kernel32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\user32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\gdi32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\winspool.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\shell32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\ole32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\oleaut32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\uuid.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\comdlg32.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64\advapi32.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\MSVCRT.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\OLDNAMES.lib: Поиск C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64\vcruntime.lib: Поиск C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64\ucrt.lib: Поиск библиотек завершен main.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp_JxlDecoderCreate в функции main. [F:\projects\git.libjxl.vcpkg-test\build\libjxl-test.vcxproj] F:\projects\git.libjxl.vcpkg-test\build\Release\libjxl-test.exe : fatal error LNK1120: неразрешенных внешних элементов: 1 [F:\projects\git.libjxl.vcpkg-test\build\libjxl-test.vcxproj]

Pkg-config notice

There are pkg-config files for libjxl, but I don't use pkg-config and have no plans to use it for technical reasons.

Question

Am I missing something? Is there a way to import libjxl with find_library only?

HappySeaFox commented 11 months ago

https://github.com/libjxl/libjxl/issues/2851

dg0yt commented 11 months ago

_imp_JxlDecoderCreate

This shouldn't occur for x64-windows-static.

HappySeaFox commented 11 months ago

The issue is a little bit more complicated. See https://github.com/libjxl/libjxl/issues/2851. I'm not sure if it's could be fixed on the vcpkg side. The problem is that I need to define JXL_STATIC_DEFINE in the client app. But even if I define it, the link process fails with missing dependencies like hwy or brotli.

xiaozhuai commented 11 months ago

The issue is a little bit more complicated. See https://github.com/libjxl/libjxl/issues/2851. I'm not sure if it's could be fixed on the vcpkg side.

@HappySeaFox

Option 1

We can fix it on vcpkg side by provide an unofficial cmake config. Then we can use it like (No need to define JXL_STATIC_DEFINE)

find_package(unofficial-libjxl CONFIG REQUIRED)
target_link_libraries(main PRIVATE unofficial::libjxl::libjxl)
# And for libjxl_threads
target_link_libraries(main PRIVATE unofficial::libjxl::libjxl_threads)

You can refer to brotli port to see how to achieve this. Only if you are willing to contribute it : )

Option 2

This port has a pc file

prefix=${pcfiledir}/../..
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: libjxl
Description: Loads and saves JPEG XL files
Version: 0.8.2

Libs: "-L${libdir}" -ljxl -lm
Requires: libhwy libbrotlicommon libbrotlienc libbrotlidec lcms2
Cflags: "-I${includedir}" -DJXL_STATIC_DEFINE

Which allow the following usage, and in this way, you don't need to define JXL_STATIC_DEFINE

find_package(PkgConfig REQUIRED)
pkg_check_modules(libjxl REQUIRED IMPORTED_TARGET libjxl)
target_link_libraries(main PRIVATE PkgConfig::libjxl)
# And for libjxl_threads
pkg_check_modules(libjxl_threads REQUIRED IMPORTED_TARGET libjxl_threads)
target_link_libraries(main PRIVATE PkgConfig::libjxl_threads)

Update: It seems there was a bug in pc file. Forget it.

xiaozhuai commented 11 months ago

See also #33422 #33390 and https://github.com/libjxl/libjxl/pull/2754

github-actions[bot] commented 5 months ago

This is an automated message. Per our repo policy, stale issues get closed if there has been no activity in the past 180 days. The issue will be automatically closed in 14 days. If you wish to keep this issue open, please add a new comment.