Undefined symbols for architecture x86_64 - Mavericks (Yosemite, El Capitan…)

后端 未结 2 1115
轻奢々
轻奢々 2020-12-02 17:47

EDIT :

If you fall on this post, you may want to jump directly to the answer


I sent a post about my confusion earlie

相关标签:
2条回答
  • 2020-12-02 18:09

    All the issues I had, that were giving

    Undefined symbols for architecture x86_64

    were due to the fact that some libraries were compiled with libstdc++ and could not be used for code that is compiled/linked with libc++

    libc++ is in fact the default new library used by clang since Mavericks, however it is possible to compile with the same clang (no need to install an old gcc) with the classical libstdc++ by using the option

    -stdlib=libstdc++


    For those who use Boost it is also possible to have boost libraries on mavericks that are compiled/linked with libstdc++ by downloading the source and using (when compiling it) instead of the classical

    ./b2

    the following

    ./b2 cxxflags="-stdlib=libstdc++" linkflags="-stdlib=libstdc++"


    For those using Cmake, you may want to add in the adequate cmake file something similar to:

    find_library (LIBSTDCXX NAMES stdc++)

    and

    add_compile_options(-stdlib=libstdc++)

    and

    target_link_libraries(${PROJECT_NAME} ${LIBSTDCXX} ${YOUR_OTHER_LIBRARIES))

    0 讨论(0)
  • 2020-12-02 18:15

    I am sort of lazy and not going to read this, so feel free to vote down...

    I think you are trying build a fat 32/64 bit library...

    you have a couple of ways to do this, one if to build explicitly with 32-bit and explicitly with 64-bit... then use lipo to combine them.

    consider nominal C++ code is stored in main.cpp

    then:

    grady$ clang++ main.cpp -m64 -o64.out
    grady$ file 64.out 
    64.out: Mach-O 64-bit executable x86_64
    grady$ clang++ main.cpp -m32 -o32.out
    grady$ file 32.out 
    32.out: Mach-O executable i386
    grady$ lipo -arch i386 32.out -arch x86_64 64.out -create -output fat.out
    grady$ file fat.out
    fat.out: Mach-O universal binary with 2 architectures
    fat.out (for architecture i386):    Mach-O executable i386
    fat.out (for architecture x86_64):  Mach-O 64-bit executable x86_64
    

    or you can generally use some shortcuts with apple tools:

    grady$ clang++ main.cpp -arch i386 -arch x86_64  -ofat2.out
    grady$ file fat2.out 
    fat2.out: Mach-O universal binary with 2 architectures
    fat2.out (for architecture i386):   Mach-O executable i386
    fat2.out (for architecture x86_64): Mach-O 64-bit executable x86_64
    
    0 讨论(0)
提交回复
热议问题