Skip to content

Linker error related to iconv on macOS #20435

@mrexodia

Description

@mrexodia
  • cocos2d-x version: latest v4
  • devices test on: N/A (applies to mac target only)
  • developing environments
    • NDK version: N/A
    • Xcode version: N/A
    • VS version: N/A
    • browser type and version: N/A

Issue description

On OS X Mojave there appears to be an issue related to the iconv library. When creating a project and attempting to build it for mac there is a linker error:

[100%] Linking CXX executable bin/MyGame/MyGame.app/Contents/MacOS/MyGame Undefined symbols for architecture x86_64: "_iconv", referenced from: cocos2d::FontAtlas::conversionU32TOGB2312(std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> > const&, std::__1::unordered_map<unsigned int, unsigned int, std::__1::hash<unsigned int>, std::__1::equal_to<unsigned int>, std::__1::allocator<std::__1::pair<unsigned int const, unsigned int> > >&) in libcocos2d.a(CCFontAtlas.cpp.o) "_iconv_close", referenced from: cocos2d::FontAtlas::~FontAtlas() in libcocos2d.a(CCFontAtlas.cpp.o) "_iconv_open", referenced from: cocos2d::FontAtlas::conversionU32TOGB2312(std::__1::basic_string<char32_t, std::__1::char_traits<char32_t>, std::__1::allocator<char32_t> > const&, std::__1::unordered_map<unsigned int, unsigned int, std::__1::hash<unsigned int>, std::__1::equal_to<unsigned int>, std::__1::allocator<std::__1::pair<unsigned int const, unsigned int> > >&) in libcocos2d.a(CCFontAtlas.cpp.o) ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make[2]: *** [bin/MyGame/MyGame.app/Contents/MacOS/MyGame] Error 1 make[1]: *** [CMakeFiles/MyGame.dir/all] Error 2 make: *** [all] Error 2 

I found the relevant section in CocosConfigDepend.cmake and the issue is that:

find_library(ICONV_LIBRARY iconv) message(WARNING ${ICONV_LIBRARY}) 

Will find /usr/local/lib/libiconv.dylib, which does not export those symbols. Changing it to iconv (which should pick up whatever system library) fixes the issue.

It does export the functions, but under a different name:

$ r2 /usr/local/lib/libiconv.dylib -- Enable asm.trace to see the tracing information inside the disassembly [0x00000000]> iE [Exports] Num Paddr Vaddr Bind Type Size Name 000 0x000f3230 0x000f3230 GLOBAL FUNC 0 __libiconv_version 001 0x00003e80 0x00003e80 GLOBAL FUNC 0 _iconv_canonicalize 002 0x00002f80 0x00002f80 GLOBAL FUNC 0 _libiconv 003 0x00003010 0x00003010 GLOBAL FUNC 0 _libiconv_close 004 0x00001000 0x00001000 GLOBAL FUNC 0 _libiconv_open 005 0x00003040 0x00003040 GLOBAL FUNC 0 _libiconv_open_into 006 0x00025b70 0x00025b70 GLOBAL FUNC 0 _libiconv_set_relocation_prefix 007 0x00003860 0x00003860 GLOBAL FUNC 0 _libiconvctl 008 0x00003aa0 0x00003aa0 GLOBAL FUNC 0 _libiconvlist 

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions