From aef33b66df0ad6f085dc55b50d7847e0b8a2ccd8 Mon Sep 17 00:00:00 2001 From: Dario Binacchi Date: Wed, 17 Jul 2024 14:53:35 +0200 Subject: [PATCH] Fix building when only writer support is enabled The compilation of the following code, which links the zxing-cpp library built with only the writer (encoder) support, raises the following linking errors: using namespace ZXing; int main(void) { std::string str = "01"; BitHacks::NumberOfLeadingZeros(0); auto writer = MultiFormatWriter(BarcodeFormat::Code128); writer.setEncoding(CharacterSet::UTF8); writer.setMargin(0); auto matrix = writer.encode(str, 0, 0 /*scaledImageWidth, pixelHeight*/); return EXIT_SUCCESS; } arm-buildroot-linux-uclibcgnueabihf/bin/ld:host/arm-buildroot-linux-uclibcgnueabihf/sysroot/usr/lib/libZXing.so: undefined reference to `ZXing::TextDecoder::GuessEncoding(unsigned char const*, unsigned int, ZXing::CharacterSet)' arm-buildroot-linux-uclibcgnueabihf/bin/ld: host/arm-buildroot-linux-uclibcgnueabihf/sysroot/usr/lib/libZXing.so: undefined reference to `ZXing::HRIFromGS1[abi:cxx11](std::basic_string_view >)' arm-buildroot-linux-uclibcgnueabihf/bin/ld: host/arm-buildroot-linux-uclibcgnueabihf/sysroot/usr/lib/libZXing.so: undefined reference to `ZXing::TextDecoder::Append(std::__cxx11::basic_string, std::allocator >&, unsigned char const*, unsigned int, ZXing::CharacterSet, bool)' arm-buildroot-linux-uclibcgnueabihf/bin/ld: host/arm-buildroot-linux-uclibcgnueabihf/sysroot/usr/lib/libZXing.so: undefined reference to `ZXing::HRIFromISO15434[abi:cxx11](std::basic_string_view >)' collect2: error: ld returned 1 exit status The patch fixes these errors. Co-Developed-by: Francesco Nicoletta Puzzillo Signed-off-by: Dario Binacchi Upstream: backport from upstream https://github.com/zxing-cpp/zxing-cpp/pull/811 --- core/src/Content.cpp | 4 ++++ core/src/Content.h | 6 ++++++ core/src/DecoderResult.h | 2 ++ core/src/GTIN.cpp | 2 ++ core/src/GTIN.h | 2 ++ 5 files changed, 16 insertions(+) diff --git a/core/src/Content.cpp b/core/src/Content.cpp index 4d3c44657cf9..569d4e35614a 100644 --- a/core/src/Content.cpp +++ b/core/src/Content.cpp @@ -93,6 +93,7 @@ bool Content::canProcess() const return std::all_of(encodings.begin(), encodings.end(), [](Encoding e) { return CanProcess(e.eci); }); } +#ifdef ZXING_READERS std::string Content::render(bool withECI) const { if (empty() || !canProcess()) @@ -165,6 +166,7 @@ std::wstring Content::utfW() const { return FromUtf8(render(false)); } +#endif // ZXING_READERS ByteArray Content::bytesECI() const { @@ -188,6 +190,7 @@ ByteArray Content::bytesECI() const return ByteArray(res); } +#ifdef ZXING_READERS CharacterSet Content::guessEncoding() const { // assemble all blocks with unknown encoding @@ -236,5 +239,6 @@ ContentType Content::type() const return ContentType::Mixed; } +#endif // ZXING_READERS } // namespace ZXing diff --git a/core/src/Content.h b/core/src/Content.h index 99e5a01e7140..aa77bda94d54 100644 --- a/core/src/Content.h +++ b/core/src/Content.h @@ -38,7 +38,9 @@ class Content void ForEachECIBlock(FUNC f) const; void switchEncoding(ECI eci, bool isECI); +#ifdef ZXING_READERS std::string render(bool withECI) const; +#endif // ZXING_READERS public: struct Encoding @@ -75,13 +77,17 @@ public: bool empty() const { return bytes.empty(); } bool canProcess() const; +#ifdef ZXING_READERS std::string text(TextMode mode) const; std::wstring utfW() const; // utf16 or utf32 depending on the platform, i.e. on size_of(wchar_t) std::string utf8() const { return render(false); } +#endif // ZXING_READERS ByteArray bytesECI() const; +#ifdef ZXING_READERS CharacterSet guessEncoding() const; ContentType type() const; +#endif // ZXING_READERS }; } // ZXing diff --git a/core/src/DecoderResult.h b/core/src/DecoderResult.h index 02b285084195..3117b03a923a 100644 --- a/core/src/DecoderResult.h +++ b/core/src/DecoderResult.h @@ -50,7 +50,9 @@ public: Content&& content() && { return std::move(_content); } // to keep the unit tests happy for now: +#ifdef ZXING_READERS std::wstring text() const { return _content.utfW(); } +#endif // ZXING_READERS std::string symbologyIdentifier() const { return _content.symbology.toString(false); } // Simple macro to set up getter/setter methods that save lots of boilerplate. diff --git a/core/src/GTIN.cpp b/core/src/GTIN.cpp index 256855a03070..690901062301 100644 --- a/core/src/GTIN.cpp +++ b/core/src/GTIN.cpp @@ -199,6 +199,7 @@ std::string LookupCountryIdentifier(const std::string& GTIN, const BarcodeFormat return it != std::end(COUNTRIES) && prefix >= it->first && prefix <= it->last ? it->id : std::string(); } +#ifdef ZXING_READERS std::string EanAddOn(const Result& result) { if (!(BarcodeFormat::EAN13 | BarcodeFormat::UPCA | BarcodeFormat::UPCE | BarcodeFormat::EAN8) @@ -208,6 +209,7 @@ std::string EanAddOn(const Result& result) auto pos = txt.find(' '); return pos != std::string::npos ? std::string(txt.substr(pos + 1)) : std::string(); } +#endif // ZXING_READERS std::string IssueNr(const std::string& ean2AddOn) { diff --git a/core/src/GTIN.h b/core/src/GTIN.h index d56b604e5f71..9af0b01200ce 100644 --- a/core/src/GTIN.h +++ b/core/src/GTIN.h @@ -47,7 +47,9 @@ bool IsCheckDigitValid(const std::basic_string& s) */ std::string LookupCountryIdentifier(const std::string& GTIN, const BarcodeFormat format = BarcodeFormat::None); +#ifdef ZXING_READERS std::string EanAddOn(const Result& result); +#endif // ZXING_READERS std::string IssueNr(const std::string& ean2AddOn); std::string Price(const std::string& ean5AddOn); -- 2.43.0