Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

error : definition is marked dllimport using lvgl_thorvg #46

Open
liquanqing opened this issue Jul 3, 2024 · 11 comments
Open

error : definition is marked dllimport using lvgl_thorvg #46

liquanqing opened this issue Jul 3, 2024 · 11 comments

Comments

@liquanqing
Copy link

Hi,
in windows, i use cmake with mingW compile successful except lvgl_thorvg;
but using LV_CONF_BUILD_DISABLE_THORVG_INTERNAL = ON to enable lvgl_thorvg ,
it compile error with "definition is marked dllimport ".
how can i fix it ?

@kisvegabor
Copy link
Member

kisvegabor commented Jul 10, 2024

Last time we saw a dll import issue @kdschlosser investigated it. Kevin, do you know what can be the problem with ThorVG?

@kdschlosser
Copy link

Can you paste the compiler output into a post for me so I can see what is happening?

@liquanqing
Copy link
Author

all api in thorvg are show error as follow :
lvgl-9.1.0\src\libs\thorvg\tvgCapi.cpp:63:20: error: function 'Tvg_Result tvg_canvas_destroy(Tvg_Canvas*)' definition is marked dllimport
[build] TVG_API Tvg_Result tvg_canvas_destroy(Tvg_Canvas* canvas)

lvgl-9.1.0\src\libs\thorvg\tvgCapi.cpp:498:20: error: function 'Tvg_Result tvg_shape_get_gradient(const Tvg_Paint*, Tvg_Gradient**)' definition is marked dllimport
[build] TVG_API Tvg_Result tvg_shape_get_gradient(const Tvg_Paint* paint, Tvg_Gradient** gradient)

@liquanqing
Copy link
Author

and this is my cmake file written :
set(SDL2_RELEASE_DIR source/thirdparty/SDL2-devel-2.30.4-mingw)

find_package(SDL2 2.30.4 PATHS ${SDL2_RELEASE_DIR})

message(STATUS "SDL2_DIR = ${SDL2_DIR}")
message(STATUS "SDL2_INCLUDE_DIRS = ${SDL2_INCLUDE_DIRS}")
message(STATUS "SDL2_LIBDIR = ${SDL2_LIBDIR}")
message(STATUS "SDL2_BINDIR = ${SDL2_BINDIR}")
message(STATUS "SDL2_LIBRARIES = ${SDL2_LIBRARIES}")
message(STATUS "SDL2_FOUND = ${SDL2_FOUND}")

MESSAGE(STATUS "project_source" "${PROJECT_SOURCE_DIR}")

set(LVGL_SRC_DIR ${ROOT_PATH}/source/thirdparty/lvgl)
set(LVGL_VERSION 9.1.0)
set(LVGL_SIM_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
message(STATUS "LVGL path " ${LVGL_SRC_DIR}-${LVGL_VERSION})

option(LV_USE_DRAW_SDL "Use SDL draw unit" OFF)
option(LV_USE_LIBPNG "Use libpng to decode PNG" OFF)
option(LV_USE_LIBJPEG_TURBO "Use libjpeg turbo to decode JPEG" OFF)
option(LV_USE_FFMPEG "Use libffmpeg to display video using lv_ffmpeg" OFF)
option(LV_USE_FREETYPE "Use freetype lib" OFF)
option(LV_CONF_BUILD_DISABLE_THORVG_INTERNAL "Disable building thorvg library" OFF)

MESSAGE(STATUS "lvgl source dir: ${LVGL_SRC_DIR}-${LVGL_VERSION}")
add_subdirectory(${LVGL_SRC_DIR}-${LVGL_VERSION})

add_subdirectory(lvgl_sim_src)

in lvgl_sim_src directory 's CMakeLists.txt is :
message(STATUS "get ROOT_PATH" ${ROOT_PATH})
message(STATUS "cur path " ${CMAKE_CURRENT_SOURCE_DIR})

target_include_directories(lvgl PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${LVGL_SRC_DIR}-${LVGL_VERSION} ${SDL2_INCLUDE_DIRS})
target_compile_options(lvgl PRIVATE -DLV_CONF_PATH=lv_conf.h)

add_executable(lvgl_main main.c mouse_cursor_icon.c)
target_link_directories(lvgl_main PRIVATE
${SDL2_LIBDIR})
target_include_directories(lvgl_main PUBLIC ${LVGL_SRC_DIR}-${LVGL_VERSION} ${SDL2_INCLUDE_DIRS})
target_link_libraries(lvgl_main lvgl lvgl::examples lvgl::demos lvgl::thorvg -lmingw32 ${SDL2_LIBRARIES} m pthread)

add_custom_command(TARGET lvgl_main POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${SDL2_BINDIR}/SDL2.dll $<TARGET_FILE_DIR:lvgl_main>)

@kdschlosser
Copy link

@kisvegabor

It's easy to locate the issue...

This is the compiler output

all api in thorvg are show error as follow :
lvgl-9.1.0\src\libs\thorvg\tvgCapi.cpp:63:20: error: function 'Tvg_Result tvg_canvas_destroy(Tvg_Canvas*)' definition is marked dllimport   << ------ RIGHT HERE
[build] TVG_API Tvg_Result tvg_canvas_destroy(Tvg_Canvas* canvas)

lvgl-9.1.0\src\libs\thorvg\tvgCapi.cpp:498:20: error: function 'Tvg_Result tvg_shape_get_gradient(const Tvg_Paint*, Tvg_Gradient**)' definition is marked dllimport   << ------ RIGHT HERE
[build] TVG_API Tvg_Result tvg_shape_get_gradient(const Tvg_Paint* paint, Tvg_Gradient** gradient)

searching for the function tvg_canvas_destroy we find the following..

thorvg_capi.h

TVG_API Tvg_Result tvg_canvas_destroy(Tvg_Canvas* canvas);

tvgCapi.cpp

TVG_API Tvg_Result tvg_canvas_destroy(Tvg_Canvas* canvas)
{
    if (!canvas) return TVG_RESULT_INVALID_ARGUMENT;
    delete(reinterpret_cast<Canvas*>(canvas));
    return TVG_RESULT_SUCCESS;
}

and when we look up what TVG_API is this is what is found in thorvg_capi.h

#ifndef TVG_STATIC
    #ifdef _WIN32
        #if TVG_BUILD
            #define TVG_API __declspec(dllexport)
        #else
            #define TVG_API __declspec(dllimport)
        #endif
    #elif (defined(__SUNPRO_C)  || defined(__SUNPRO_CC))
        #define TVG_API __global
    #else
        #if (defined(__GNUC__) && __GNUC__ >= 4) || defined(__INTEL_COMPILER)
            #define TVG_API __attribute__ ((visibility("default")))
        #else
            #define TVG_API
        #endif
    #endif
#else
    #define TVG_API
#endif

and there you have it. an undocumented macro.. TVG_BUILD needs to be set so that it will mark the functions as exports.

@kdschlosser
Copy link

@liquanqing

add -DTVG_BUILD=1 to your C and CPP compiler flags and that should do the trick.

@liquanqing
Copy link
Author

i had add -DTVG_BUILD=1 and the error still happened, here is my modified :

message(STATUS "get ROOT_PATH" ${ROOT_PATH})
message(STATUS "cur path " ${CMAKE_CURRENT_SOURCE_DIR})

set(CMAKE_C_FLAGS "-DTVG_BUILD=1 ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "-DTVG_BUILD=1 ${CMAKE_CXX_FLAGS}")

target_include_directories(lvgl PUBLIC  ${CMAKE_CURRENT_SOURCE_DIR} ${LVGL_SRC_DIR}-${LVGL_VERSION} ${SDL2_INCLUDE_DIRS})
target_compile_options(lvgl PRIVATE -DLV_CONF_PATH=lv_conf.h -DTVG_BUILD=1)

add_executable(lvgl_main main.c mouse_cursor_icon.c)
target_link_directories(lvgl_main PRIVATE 
                    ${SDL2_LIBDIR})
target_include_directories(lvgl_main PUBLIC ${LVGL_SRC_DIR}-${LVGL_VERSION} ${SDL2_INCLUDE_DIRS})
target_link_libraries(lvgl_main lvgl lvgl::examples lvgl::demos lvgl::thorvg -lmingw32 ${SDL2_LIBRARIES} m pthread)

add_custom_command(TARGET lvgl_main POST_BUILD
                    COMMAND ${CMAKE_COMMAND} -E copy_if_different
                    ${SDL2_BINDIR}/SDL2.dll $<TARGET_FILE_DIR:lvgl_main>)

@liquanqing
Copy link
Author

@kdschlosser
i do a little change, and it worked.
target_compile_options(lvgl PUBLIC -DLV_CONF_PATH=lv_conf.h -DTVG_BUILD=1)
Thanks.

@liquanqing
Copy link
Author

compiler is successful. and i run lvgl_main.exe vector_graphic and it maybe call some wrong.
image

@kdschlosser
Copy link

That is going to be in @kisvegabor 's court to help you. I know the build systems and documentation. LVGL's inner workings are not my strong area especially the vector graphics stuff.

@kisvegabor
Copy link
Member

Awesome! Please try modifying this part to

target_compile_definitions(lvgl
    INTERFACE LV_ATTRIBUTE_EXTERN_DATA=__declspec\(dllimport\)
    PRIVATE LV_ATTRIBUTE_EXTERN_DATA=__declspec\(dllexport\)
    PRIVATE TVG_BUILD=1
)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants