Mudassir
Mudassir

Reputation: 13184

CMake Script throwings Errors While Trying to Build ZXing (Native) for Android

I am trying to build ZXing from its C++ source code in Android Studio. But CMake is throwing a lot of errors, while I am not having much experience with NDK development, and errors are not descriptive enough to understand, can't figure out whats going wrong here. Right now, I am facing the following issue;

CMake Error at CMakeLists.txt:90 (add_executable):
CMake Error at CMakeLists.txt:91 (add_executable):
CMake Error at CMakeLists.txt:92 (target_link_libraries):

I tried to read through CMake docs to understand the syntax of commands, they seems fine in CMakeLists.txt (listed below).

Can somebody experienced with these native stuff please shed some light.

CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(zxing)

option(BUILD_TESTING "Enable generation of test targets" OFF)

set(CMAKE_LIBRARY_PATH /opt/local/lib ${CMAKE_LIBRARY_PATH})
set(OpenCV_DIR C:/opencv-3.4.3-android-sdk/OpenCV-android-sdk/sdk/native/jni)
# set(Iconv_DIR C:/Users/bcs/Downloads/libiconv-1.9.2-1-bin)


# Check for polluted source tree.
if(EXISTS ${CMAKE_SOURCE_DIR}/CMakeCache.txt OR
    EXISTS ${CMAKE_SOURCE_DIR}/CMakeFiles)
    message(FATAL_ERROR
        "Source directory is polluted:"
        "\n  * remove CMakeCache.txt"
        "\n  * remove CMakeFiles directory")
endif()

# Suppress in-source builds.
if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
    message(FATAL_ERROR
        "CMake generation is not allowed within the source directory:"
        "\n  * mkdir build"
        "\n  * cd build"
        "\n  * Unix-like: cmake -G \"Unix Makefiles\" .."
        "\n  * Windows: cmake -G \"Visual Studio 10\" ..")
endif()

# Adjust CMake's module path.
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/FindModules)

# Suppress MSVC CRT warnings.
if(MSVC)
    add_definitions(-D_CRT_SECURE_NO_WARNINGS)
    add_definitions(/Za)
    add_definitions(/MP) # multi-core builds
endif()

include(source_files.cmake)

if(WIN32)
    include_directories(core/lib/win32)
    set(CMAKE_DEBUG_POSTFIX -debug)
endif()

# OpenCV classes
find_package(OpenCV)
if(OpenCV_FOUND)
    list(APPEND LIBZXING_FILES
        opencv/src/zxing/MatSource.cpp
        opencv/src/zxing/MatSource.h
    )

    include_directories(${OpenCV_INCLUDE_DIRS})
    include_directories(opencv/src)
endif()

include_directories(core/src)
add_library(libzxing ${LIBZXING_FILES})
set_target_properties(libzxing PROPERTIES PREFIX "")

find_package(Iconv)
if(ICONV_FOUND)
    include_directories(${ICONV_INCLUDE_DIR})
    target_link_libraries(libzxing ${ICONV_LIBRARIES})
 else()
   add_definitions(-DNO_ICONV=1)
 endif()
    add_definitions(-DNO_ICONV=1)

# Add OpenCV cli executable
if(OpenCV_FOUND)
    file(GLOB_RECURSE OPENCV_ZXING_FILES
        "./opencv-cli/src/*.cpp"
        "./opencv-cli/src/*.h"
    )
    # add_executable(zxing-cv ${OPENCV_ZXING_FILES})
    add_executable(zxing-cv "./opencv-cli/src/*.cpp")
    target_link_libraries(zxing-cv libzxing ${OpenCV_LIBRARIES})
endif()

# Add cli executable.
file(GLOB_RECURSE ZXING_FILES
    "./cli/src/*.cpp"
    "./cli/src/*.h"
)

 add_executable(zxing ${ZXING_FILES})
 add_executable(zxing-cv "./opencv-cli/src/*.cpp")
 target_link_libraries(zxing libzxing)

install(TARGETS zxing libzxing EXPORT zxing-targets
    LIBRARY DESTINATION lib
    RUNTIME DESTINATION bin
    ARCHIVE DESTINATION lib
    INCLUDES DESTINATION include
)

install(EXPORT zxing-targets DESTINATION lib/zxing/cmake NAMESPACE zxing::)

install(
    DIRECTORY core/src/zxing/
    DESTINATION include/zxing
    FILES_MATCHING PATTERN "*.h"
)

if(OpenCV_FOUND)
    install(
        DIRECTORY opencv/src/zxing/
        DESTINATION include/zxing
        FILES_MATCHING PATTERN "*.h"
    )
endif()

configure_file(cmake/zxing-config.cmake.in zxing-config.cmake @ONLY)
install(FILES ${CMAKE_BINARY_DIR}/zxing-config.cmake DESTINATION lib/zxing/cmake)

if(BUILD_TESTING)
    # Add testrunner executable.
    find_package(CPPUNIT)
    if(CPPUNIT_FOUND)
        file(GLOB_RECURSE TESTRUNNER_FILES
            "./core/tests/src/*.cpp"
            "./core/tests/src/*.h"
        )
        add_executable(testrunner ${TESTRUNNER_FILES})
        include_directories(${CPPUNIT_INCLUDE_DIR})
        target_link_libraries(testrunner libzxing  ${CPPUNIT_LIBRARIES})
    endif()
endif()

Upvotes: 1

Views: 749

Answers (1)

tanius
tanius

Reputation: 16839

You could switch to nu-book/zxing-cpp

There has been quite some confusion around the various ports of ZXing to C++. Since recently, nu-book/zxing-cpp is considered something like the "official" ZXing C++ port, following this discussion.

According to my own estimation, that is the most active and most advanced of the current ports. It differs from the port glassechidna/zxing-cpp that you tried to use by being a complete re-implementation in C++, not a direct 1:1 port from the original ZXing Java API to C++. That should make the names etc. "nicer" in a C++ environment.

Building it

I had no major issues building nu-book/zxing-cpp and using it in an application (though I have yet to try it for Android). I did not use Android Studio to build it though, but just the console, as follows:

cd /path/to/zxing-cpp/sources && mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/path/to/zxing-cpp/sources/export
make
make install

After that, you can use it in a CMake based project that is configured with cmake .. -DCMAKE_PREFIX_PATH=/path/to/zxing-cpp/sources/export/lib/cmake/ZXing and has this in its CMakeLists.txt:

find_package(ZXing REQUIRED)
add_executable( ... )
target_link_libraries(minimal-zxing-demo ZXing::ZXing)

Upvotes: 1

Related Questions