MacPorts + CMakeで_iconvなどのシンボルが見つからない場合の対処


結論

cmakeのオプションに-DCMAKE_PREFIX_PATH=/opt/localを指定して、MacPorts内のヘッダファイル、ライブラリを検索するように指定する

背景

ZXing C++ Library をMacPorts上のCMakeでビルドすると、下記のメッセージが出てビルドが失敗してしまいました。_iconv, _iconv_close, _iconv_openというシンボルが見つからないというエラーです。

Undefined symbols for architecture x86_64:
  "_iconv", referenced from:
      (anonymous namespace)::add(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char) in libzxing.a(Decoder.cpp.o)
      zxing::qrcode::DecodedBitStreamParser::append(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char const*, unsigned long, char const*) in libzxing.a(DecodedBitStreamParser.cpp.o)
  "_iconv_close", referenced from:
      (anonymous namespace)::add(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char) in libzxing.a(Decoder.cpp.o)
      zxing::qrcode::DecodedBitStreamParser::append(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char const*, unsigned long, char const*) in libzxing.a(DecodedBitStreamParser.cpp.o)
  "_iconv_open", referenced from:
      (anonymous namespace)::add(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char) in libzxing.a(Decoder.cpp.o)
      zxing::qrcode::DecodedBitStreamParser::append(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char const*, unsigned long, char const*) in libzxing.a(DecodedBitStreamParser.cpp.o)
ld: symbol(s) not found for architecture x86_64

cmake実行時の下記のログから、iconvは見つかっているようでした。

-- Found Iconv: /opt/local/lib/libiconv.dylib

原因

ライブラリは/opt/local配下のものが見つかっていましたが、インクルードファイルは/usr配下のものが見つかっていたのが原因でした。/usr配下のiconvと/opt/local配下のiconvには違いがあるため、上記のエラーが出ていました。

解決方法

cmake実行時のオプションに、-DCMAKE_PREFIX_PATH=/opt/localを指定することで、/opt/local配下のファイルを優先的に検索させることができます。このオプションをつけることで、問題が解決し、ビルドに成功しました。