Skip to content

Build failed on macOS App with Swift on Xcode due to Undefined symbols _opj_*** #18023

@treastrain

Description

@treastrain
System information (version)
  • OpenCV => 4.4.0
  • Operating System / Platform => macOS Catalina 10.15.6 (19G73), Swift (5.2.4, 5.3)
  • Compiler => Xcode Version 11.6 (11E708), Xcode Version 12.0 beta 3 (12A8169g)
$ swift --version 
Apple Swift version 5.2.4 (swiftlang-1103.0.32.9 clang-1103.0.32.53)
Target: x86_64-apple-darwin19.6.0

$ cmake --version
cmake version 3.17.3

$ python --version
Python 2.7.18

$ xcode-select --version
xcode-select version 2373.
Detailed description

I'm developing a Command Line Tool application for macOS on Xcode. When I installed OpenCV 4.4.0, I got an error with "Undefined symbols". So I added the necessary frameworks and libraries, but I don't know which frameworks I should add for these below. The developing app build does not succeed because of these "Undefined symbols" errors.

  • _opj_create_compress
  • _opj_create_decompress
  • _opj_decode
  • _opj_destroy_codec
  • _opj_encode
  • _opj_end_compress
  • _opj_image_create
  • _opj_image_destroy
  • _opj_read_header
  • _opj_set_default_decoder_parameters
  • _opj_set_default_encoder_parameters
  • _opj_set_error_handler
  • _opj_set_warning_handler
  • _opj_setup_decoder
  • _opj_setup_encoder
  • _opj_start_compress
  • _opj_stream_create_default_file_stream
  • _opj_stream_default_create
  • _opj_stream_destroy
  • _opj_stream_set_read_function
  • _opj_stream_set_seek_function
  • _opj_stream_set_skip_function
  • _opj_stream_set_user_data
  • _opj_stream_set_user_data_length
Steps to reproduce
  1. Download and unzip 4.4.0.zip from https://opencv.org/releases/
  2. Build opencv2.framework for macOS.
$ cd opencv-4.4.0/platforms/osx
$ python ./build_framework.py .
  1. Create a new project in Xcode. Choose the "Command Line Tool" of macOS as a template. Choose "Swift".
  2. Add the opencv2.framework to the "Frameworks and Libraries" section of TARGET.
  3. (Optional) In Build Settings, set the path of the directory where the opencv2.framework is located to "Framework Search Paths".
  4. In Build Settings, specify -all_load for "Other Linker Flags". (Thanks @komakai at Mat initWithUIImage: does not work (Objective-C / Swift) #17532 )
  5. Make main.swift look like this:
import Foundation
import opencv2

print("Hello, World!")

let fileName = "input.png"
print("Reading the image:", fileName)

let bgrImage = Imgcodecs.imread(filename: fileName)
  1. Building here will cause a lot of undefined symbol errors.
  2. Based on the errors, add the following to the "Frameworks and Libraries" section of Target.
  • Accelerate.framework
  • AppKit.framework
  • AVFoundation.framework
  • CoreMedia.framework
  • CoreVideo.framework
  • libc++.tbd
  • OpenCL.framework
  1. Build. 24 "Undefined symbols" errors starting with _opj are not resolved.
Undefined symbols for architecture x86_64:
  "_opj_create_compress", referenced from:
      cv::Jpeg2KOpjEncoder::write(cv::Mat const&, std::__1::vector<int, std::__1::allocator<int> > const&) in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_create_decompress", referenced from:
      cv::Jpeg2KOpjDecoder::readHeader() in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_decode", referenced from:
      cv::Jpeg2KOpjDecoder::readData(cv::Mat&) in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_destroy_codec", referenced from:
      cv::Jpeg2KOpjDecoder::~Jpeg2KOpjDecoder() in opencv2(loadsave.o)
      cv::Jpeg2KOpjDecoder::readHeader() in opencv2(grfmt_jpeg2000_openjpeg.o)
      cv::Jpeg2KOpjEncoder::write(cv::Mat const&, std::__1::vector<int, std::__1::allocator<int> > const&) in opencv2(grfmt_jpeg2000_openjpeg.o)
      cv::Jpeg2KOpjDecoder::~Jpeg2KOpjDecoder() in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_encode", referenced from:
      cv::Jpeg2KOpjEncoder::write(cv::Mat const&, std::__1::vector<int, std::__1::allocator<int> > const&) in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_end_compress", referenced from:
      cv::Jpeg2KOpjEncoder::write(cv::Mat const&, std::__1::vector<int, std::__1::allocator<int> > const&) in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_image_create", referenced from:
      cv::Jpeg2KOpjEncoder::write(cv::Mat const&, std::__1::vector<int, std::__1::allocator<int> > const&) in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_image_destroy", referenced from:
      cv::Jpeg2KOpjDecoder::~Jpeg2KOpjDecoder() in opencv2(loadsave.o)
      cv::Jpeg2KOpjDecoder::readHeader() in opencv2(grfmt_jpeg2000_openjpeg.o)
      cv::Jpeg2KOpjEncoder::write(cv::Mat const&, std::__1::vector<int, std::__1::allocator<int> > const&) in opencv2(grfmt_jpeg2000_openjpeg.o)
      cv::Jpeg2KOpjDecoder::~Jpeg2KOpjDecoder() in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_read_header", referenced from:
      cv::Jpeg2KOpjDecoder::readHeader() in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_set_default_decoder_parameters", referenced from:
      cv::Jpeg2KOpjDecoder::readHeader() in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_set_default_encoder_parameters", referenced from:
      cv::Jpeg2KOpjEncoder::write(cv::Mat const&, std::__1::vector<int, std::__1::allocator<int> > const&) in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_set_error_handler", referenced from:
      cv::(anonymous namespace)::setupLogCallbacks(void**) in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_set_warning_handler", referenced from:
      cv::(anonymous namespace)::setupLogCallbacks(void**) in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_setup_decoder", referenced from:
      cv::Jpeg2KOpjDecoder::readHeader() in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_setup_encoder", referenced from:
      cv::Jpeg2KOpjEncoder::write(cv::Mat const&, std::__1::vector<int, std::__1::allocator<int> > const&) in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_start_compress", referenced from:
      cv::Jpeg2KOpjEncoder::write(cv::Mat const&, std::__1::vector<int, std::__1::allocator<int> > const&) in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_stream_create_default_file_stream", referenced from:
      cv::Jpeg2KOpjDecoder::readHeader() in opencv2(grfmt_jpeg2000_openjpeg.o)
      cv::Jpeg2KOpjEncoder::write(cv::Mat const&, std::__1::vector<int, std::__1::allocator<int> > const&) in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_stream_default_create", referenced from:
      cv::Jpeg2KOpjDecoder::readHeader() in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_stream_destroy", referenced from:
      cv::Jpeg2KOpjDecoder::~Jpeg2KOpjDecoder() in opencv2(loadsave.o)
      cv::Jpeg2KOpjDecoder::readHeader() in opencv2(grfmt_jpeg2000_openjpeg.o)
      cv::Jpeg2KOpjEncoder::write(cv::Mat const&, std::__1::vector<int, std::__1::allocator<int> > const&) in opencv2(grfmt_jpeg2000_openjpeg.o)
      cv::Jpeg2KOpjDecoder::~Jpeg2KOpjDecoder() in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_stream_set_read_function", referenced from:
      cv::Jpeg2KOpjDecoder::readHeader() in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_stream_set_seek_function", referenced from:
      cv::Jpeg2KOpjDecoder::readHeader() in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_stream_set_skip_function", referenced from:
      cv::Jpeg2KOpjDecoder::readHeader() in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_stream_set_user_data", referenced from:
      cv::Jpeg2KOpjDecoder::readHeader() in opencv2(grfmt_jpeg2000_openjpeg.o)
  "_opj_stream_set_user_data_length", referenced from:
      cv::Jpeg2KOpjDecoder::readHeader() in opencv2(grfmt_jpeg2000_openjpeg.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

スクリーンショット 2020-08-03 17 52 28

スクリーンショット 2020-08-03 17 52 16

Issue submission checklist
  • I report the issue, it's not a question
  • I checked the problem with documentation, FAQ, open issues,
    answers.opencv.org, Stack Overflow, etc and have not found solution
  • I updated to latest OpenCV version and the issue is still there
  • There is reproducer code and related data files: videos, images, onnx, etc

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions