How do I link third party libraries like fftw3 and sndfile to an iPhone project in Xcode?

左心房为你撑大大i 提交于 2019-12-28 12:46:48

问题


I'm trying to link third party libraries like fftw3 and sndfile to my iPhone project in Xcode3.2. I got it working in a regular Mac project by setting the "Header Search Path" to "/usr/local/include" and the "Other Linker Flags" to "-lfftw3 -lsndfile" under the project build configuration. However, it gave me "library not found for -lfftw3" with exit code 1 error message when I tried to build it in the iPhone project using the same settings.

Does apple not allow this on the iPhone? Is there a way to get around this?


回答1:


You need to build your libraries as universal static libraries. The process varies from library to library but it generally goes something like this.

  1. build the library as a static lib for the different platforms (armv6 and i386 at the least)
  2. use lipo to create a universal library from the individual static libraries built above
  3. drag and drop the universal lib into your xcode project
  4. drag and drop the header files into your xcode project

Step 1 is generally the trickiest since many libraries have different build procedures. It is usually done by setting the proper compiler flags to use the iphone sdk instead of the system wide compiler.




回答2:


I've modified Epskampie's script for IOS 5.0+
Used with fftw3.3.3 on OS X 10.7 with IOS SDK 6.0 and MacOSX SDK 10.8

#!/bin/sh

# build_ios5.sh
# build an arm / i386 / x86_64 lib of fftw3
# make sure to check that all the paths used in this script exist on your system
#
# adopted from:
# http://robertcarlsen.net/2009/07/15/cross-compiling-for-iphone-dev-884
# changed by Nickun
# original:
# http://stackoverflow.com/questions/3588904/how-to-link-third-party-libraries-like-fftw3-and-sndfile-to-an-iphone-project-in


# make sure we start out clean
make distclean

# this is the folder where the results of our efforts will end up:
export RESULT_DIR=ios-library

# Select toolchains folder
export XCODE_TOOLCHAINS=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain
# Select the desired iPhone SDK
export DEVROOT_IOS=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
export SDKROOT_IOS=$DEVROOT_IOS/SDKs/iPhoneOS6.0.sdk
# Select the OSX SDK
export DEVROOT_OSX=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer
export SDKROOT_OSX=$DEVROOT_OSX/SDKs/MacOSX10.8.sdk

# ------------------------ armv7---------------------------
# Set up relevant environment variables
export CPPFLAGS="-I$SDKROOT_IOS/usr/include/ -mfpu=neon"
export CFLAGS="$CPPFLAGS -arch armv7 -mfpu=neon -no-cpp-precomp -miphoneos-version-min=5.0 -isysroot $SDKROOT_IOS"
export LD=$XCODE_TOOLCHAINS/usr/bin/ld
export CXX="$XCODE_TOOLCHAINS/usr/bin/clang -x c++ -arch armv7 -std=gnu++11 -stdlib=libc++ -mfpu=neon"
export CC="$XCODE_TOOLCHAINS/usr/bin/clang -x c -arch armv7 -std=gnu99 -mfpu=neon"
export CXXFLAGS="$CFLAGS"

# TODO: add custom flags as necessary for package
#  remove '--enable-float' for double precision
#  and take a 'libfftw3.a' file instead
./configure --host=arm-apple-darwin --enable-float --enable-neon

make -j2

# Copy the ARM library to a temporary location
mkdir $RESULT_DIR
cp .libs/libfftw3f.a $RESULT_DIR/libfftw3f_armv7.a

# Copy the header file too, just for convenience
cp api/fftw3.h $RESULT_DIR/fftw3.h

# ------------------------ armv7s---------------------------
# Do it all again for i386
make distclean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP LD CXX LDFLAGS CXXFLAGS

# Set up relevant environment variables
export CPPFLAGS="-I$SDKROOT_IOS/usr/include/ -mfpu=neon"
export CFLAGS="$CPPFLAGS -arch armv7s -mfpu=neon -no-cpp-precomp -miphoneos-version-min=5.0 -isysroot $SDKROOT_IOS"
export LD=$XCODE_TOOLCHAINS/usr/bin/ld
export CXX="$XCODE_TOOLCHAINS/usr/bin/clang -x c++ -arch armv7s -std=gnu++11 -stdlib=libc++ -mfpu=neon"
export CC="$XCODE_TOOLCHAINS/usr/bin/clang -x c -arch armv7s -std=gnu99 -mfpu=neon"
export CXXFLAGS="$CFLAGS"

# TODO: add custom flags as necessary for package
#  remove '--enable-float' for double precision
#  and take a 'libfftw3.a' file instead
./configure --host=arm-apple-darwin --enable-float --enable-neon

make -j2

# Copy the ARM library to a temporary location
mkdir $RESULT_DIR
cp .libs/libfftw3f.a $RESULT_DIR/libfftw3f_armv7s.a


# ------------------------ i386 ---------------------------
# Do it all again for i386
make distclean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP LD CXX LDFLAGS CXXFLAGS

export CPPFLAGS="-I$SDKROOT_OSX/usr/include/"
export CFLAGS="$CPPFLAGS -arch i386 -no-cpp-precomp -mmacosx-version-min=10.7 -isysroot $SDKROOT_OSX"
export LD="$XCODE_TOOLCHAINS/usr/bin/ld"
export CXX="$XCODE_TOOLCHAINS/usr/bin/clang -x c++ -arch i386 -std=gnu++11 -stdlib=libc++"
export CC="$XCODE_TOOLCHAINS/usr/bin/clang -x c -arch i386 -std=gnu99"
export CXXFLAGS="$CFLAGS"

# TODO: error checking
./configure --enable-float
make -j2

# Copy the FAT native library to the temporary location
cp .libs/libfftw3f.a $RESULT_DIR/libfftw3f_i386.a

# ------------------------ x86_64 ---------------------------
# Do it all again for x86_64
make distclean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP LD CXX LDFLAGS CXXFLAGS

export CPPFLAGS="-I$SDKROOT_OSX/usr/include/"
export CFLAGS="$CPPFLAGS -arch x86_64 -no-cpp-precomp -mmacosx-version-min=10.7 -isysroot $SDKROOT_OSX"
export LD="$XCODE_TOOLCHAINS/usr/bin/ld"
export CXX="$XCODE_TOOLCHAINS/usr/bin/clang -x c++ -arch x86_64 -std=gnu++11 -stdlib=libc++"
export CC="$XCODE_TOOLCHAINS/usr/bin/clang -x c -arch x86_64 -std=gnu99"
export CXXFLAGS="$CFLAGS"

# TODO: error checking
./configure --enable-float
make -j2

# Copy the FAT native library to the temporary location
cp .libs/libfftw3f.a $RESULT_DIR/libfftw3f_x86_64.a



# Create fat lib by combining the two versions
lipo -arch armv7 $RESULT_DIR/libfftw3f_armv7.a -arch armv7s $RESULT_DIR/libfftw3f_armv7s.a -arch i386 $RESULT_DIR/libfftw3f_i386.a -arch x86_64 $RESULT_DIR/libfftw3f_x86_64.a -create -output $RESULT_DIR/libfftw3f.a

# Remove intermediate binaries
#rm $RESULT_DIR/libfftw3_armv7.a
#rm $RESULT_DIR/libfftw3_i386.a
#rm $RESULT_DIR/libfftw3_x86_64.a

# Unset used environment variables
unset CPPFLAGS CFLAGS CPP LD LDFLAGS CXX CXXFLAGS



回答3:


For compiling fftw3 for use in an iOS project, i've adapted the script posted here: http://robertcarlsen.net/2009/07/15/cross-compiling-for-iphone-dev-884

Used with fftw3.2.2 on OS X 10.6 with iOs SDK 3.2

#!/bin/sh

# build_iphone.sh
# build an arm / i386 lib of fftw3
# make sure to check that all the paths used in this script exist on your system
#
# adopted from:
# http://robertcarlsen.net/2009/07/15/cross-compiling-for-iphone-dev-884


# make sure we start out clean
make distclean

# this is the folder where the results of our efforts will end up:
export RESULT_DIR=ios-library

# Select the desired iPhone SDK
export DEVROOT=/Developer/Platforms/iPhoneOS.platform/Developer
export SDKROOT=$DEVROOT/SDKs/iPhoneOS3.2.sdk

# Set up relevant environment variables
export CPPFLAGS="-I$SDKROOT/usr/lib/gcc/arm-apple-darwin9/4.0.1/include/ -I$SDKROOT/usr/include/ -miphoneos-version-min=2.2"
export CFLAGS="$CPPFLAGS -arch armv6 -pipe -no-cpp-precomp -isysroot $SDKROOT"
export CPP="$DEVROOT/usr/bin/cpp $CPPFLAGS"
export CXXFLAGS="$CFLAGS"

# TODO: add custom flags as necessary for package
./configure CC=$DEVROOT/usr/bin/arm-apple-darwin10-gcc-4.0.1 LD=$DEVROOT/usr/bin/ld --host=arm-apple-darwin

make -j4

# Copy the ARM library to a temporary location
mkdir $RESULT_DIR
cp .libs/libfftw3.a $RESULT_DIR/libfftw3_arm.a

# Copy the header file too, just for convenience
cp api/fftw3.h ios-library/fftw3.h

# Do it all again for i386
make distclean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP LDFLAGS CXXFLAGS DEVROOT SDKROOT

export DEVROOT=/Developer
export SDKROOT=$DEVROOT/SDKs/MacOSX10.6.sdk

export CPPFLAGS="-I$SDKROOT/usr/lib/gcc/i686-apple-darwin10/4.0.1/include/ -I$SDKROOT/usr/include/ -mmacosx-version-min=10.5"
export CFLAGS="$CPPFLAGS -pipe -no-cpp-precomp -isysroot $SDKROOT -arch i386"
export CPP="$DEVROOT/usr/bin/cpp $CPPFLAGS"
export CXXFLAGS="$CFLAGS"

# TODO: error checking
./configure
make -j4

# Copy the native library to the temporary location
cp .libs/libfftw3.a $RESULT_DIR/libfftw3_386.a

# Create fat lib by combining the two versions
lipo -arch arm $RESULT_DIR/libfftw3_arm.a -arch i386 $RESULT_DIR/libfftw3_386.a -create -output $RESULT_DIR/libfftw3.a

# Remove intermediate binaries
rm $RESULT_DIR/libfftw3_arm.a
rm $RESULT_DIR/libfftw3_386.a

# Unset used environment variables
unset CPPFLAGS CFLAGS CPP LDFLAGS CPP CXXFLAGS DEVROOT SDKROOT

Run this script from the directory containing fftw3. The files you need should end up in the ios-library folder.




回答4:


I modified Nickun's script for Mac OS X 10.9.2, iOS 7.1, fftw-3.3.4. It also adds an arm64 slice to the fat file. Here is the script ->

#!/bin/sh

# build_lipo.sh
# build an arm64 / armv7s / armv7 / i386 / x86_64 lib of fftw3
# make sure to check that all the paths used in this script exist on your system
#
# adopted from:
# http://robertcarlsen.net/2009/07/15/cross-compiling-for-iphone-dev-884
# changed by Adam
# original: by Nickun
# http://stackoverflow.com/questions/3588904/how-to-link-third-party-libraries-like-fftw3-and-sndfile-to-an-iphone-project-in

# this is the folder where the results of our efforts will end up:
export RESULT_DIR=ios-library

# Select toolchains folder
export XCODE_TOOLCHAINS=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain
# Select the desired iPhone SDK
export DEVROOT_IOS=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
export SDKROOT_IOS=$DEVROOT_IOS/SDKs/iPhoneOS7.1.sdk
# Select the OSX SDK
export DEVROOT_OSX=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer
export SDKROOT_OSX=$DEVROOT_OSX/SDKs/MacOSX10.9.2.sdk

# ------------------------ i386 ---------------------------
# Do it for i386
make clean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP LD CXX LDFLAGS CXXFLAGS

export CFLAGS="-arch i386"

# TODO: error checking
./configure --enable-float --host=i386-apple-darwin9.2.0 --target=i386-apple-darwin9.2.0
make -j2

# Copy the FAT native library to a temporary location
mkdir $RESULT_DIR
cp .libs/libfftw3f.a $RESULT_DIR/libfftw3f_i386.a

# ------------------------ x86_64 ---------------------------
# Do it all again for x86_64
make clean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP LD CXX LDFLAGS CXXFLAGS

# TODO: error checking
./configure --enable-float
make -j2

# Copy the FAT native library to the temporary location
cp .libs/libfftw3f.a $RESULT_DIR/libfftw3f_x86_64.a

# ------------------------ armv7---------------------------
# Do it all again for armv7
make clean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP LD CXX LDFLAGS CXXFLAGS

# Set up relevant environment variables
export CPPFLAGS="-I$SDKROOT_IOS/usr/include/ -mfpu=neon"
export CFLAGS="$CPPFLAGS -arch armv7 -mfpu=neon -no-cpp-precomp -miphoneos-version-min=5.0 -isysroot $SDKROOT_IOS"
export LD=$XCODE_TOOLCHAINS/usr/bin/ld
export CXX="$XCODE_TOOLCHAINS/usr/bin/clang -x c++ -arch armv7 -std=gnu++11 -stdlib=libc++ -mfpu=neon"
export CC="$XCODE_TOOLCHAINS/usr/bin/clang -x c -arch armv7 -std=gnu99 -mfpu=neon"
export CXXFLAGS="$CFLAGS"

# TODO: add custom flags as necessary for package
#  remove '--enable-float' for double precision
#  and take a 'libfftw3.a' file instead
./configure --host=arm-apple-darwin --target=arm-apple-darwin --enable-float --enable-neon

make -j2

cp .libs/libfftw3f.a $RESULT_DIR/libfftw3f_armv7.a

# Copy the header file too, just for convenience
cp api/fftw3.h $RESULT_DIR/fftw3.h

# ------------------------ armv7s---------------------------
# Do it all again for i386
make clean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP LD CXX LDFLAGS CXXFLAGS

# Set up relevant environment variables
export CPPFLAGS="-I$SDKROOT_IOS/usr/include/ -mfpu=neon"
export CFLAGS="$CPPFLAGS -arch armv7s -mfpu=neon -no-cpp-precomp -miphoneos-version-min=5.0 -isysroot $SDKROOT_IOS"
export LD=$XCODE_TOOLCHAINS/usr/bin/ld
export CXX="$XCODE_TOOLCHAINS/usr/bin/clang -x c++ -arch armv7s -std=gnu++11 -stdlib=libc++ -mfpu=neon"
export CC="$XCODE_TOOLCHAINS/usr/bin/clang -x c -arch armv7s -std=gnu99 -mfpu=neon"
export CXXFLAGS="$CFLAGS"

# TODO: add custom flags as necessary for package
#  remove '--enable-float' for double precision
#  and take a 'libfftw3.a' file instead
./configure --host=arm-apple-darwin --target=arm-apple-darwin --enable-float --enable-neon

make -j2

# Copy the ARM library to a temporary location
cp .libs/libfftw3f.a $RESULT_DIR/libfftw3f_armv7s.a

# ------------------------ arm64 ---------------------------
# Do it all again for arm64
make clean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP LD CXX LDFLAGS CXXFLAGS

# Set up relevant environment variables
export CPPFLAGS="-I$SDKROOT_IOS/usr/include/ -mfpu=neon"
export CFLAGS="$CPPFLAGS -arch arm64 -mfpu=neon -no-cpp-precomp -miphoneos-version-min=5.0 -isysroot $SDKROOT_IOS"
export LD=$XCODE_TOOLCHAINS/usr/bin/ld
export CXX="$XCODE_TOOLCHAINS/usr/bin/clang -x c++ -arch arm64 -std=gnu++11 -stdlib=libc++ -mfpu=neon"
export CC="$XCODE_TOOLCHAINS/usr/bin/clang -x c -arch arm64 -std=gnu99 -mfpu=neon"
export CXXFLAGS="$CFLAGS"

# TODO: add custom flags as necessary for package
#  remove '--enable-float' for double precision
#  and take a 'libfftw3.a' file instead
./configure --host=arm-apple-darwin --target=arm-apple-darwin --enable-float --enable-neon

make -j2

# Copy the ARM library to a temporary location
cp .libs/libfftw3f.a ios-library/libfftw3f_arm64.a


# Create fat lib by combining the two versions
lipo -arch armv7 $RESULT_DIR/libfftw3f_armv7.a -arch armv7s $RESULT_DIR/libfftw3f_armv7s.a -arch i386 $RESULT_DIR/libfftw3f_i386.a -arch x86_64 $RESULT_DIR/libfftw3f_x86_64.a -arch arm64 $RESULT_DIR/libfftw3f_arm64.a -create -output $RESULT_DIR/libfftw3f.a

# Remove intermediate binaries
#rm $RESULT_DIR/libfftw3_armv7.a
#rm $RESULT_DIR/libfftw3_i386.a
#rm $RESULT_DIR/libfftw3_x86_64.a

# Unset used environment variables
unset CPPFLAGS CFLAGS CPP LD LDFLAGS CXX CXXFLAGS



回答5:


It's not that Apple isn't allowing the library, it's that the version you are linking to is x86, and so it won't run on the iPhone. You need to build the library using the iPhone SDK, then link to that version.

Alternatively, you can be a little naughty and include the 3rd-party source in your main project. Naughty, but it'll prove the point that Apple isn't stopping you, and show whether the library will run on the phone OK.

It's cleaner to keep the code in a separately-built library project though.




回答6:


Build FFTW3 for iOS:

Here is a script to create .h and .a files for different iOS architectures (device, simulator, ...)

Enjoy it!

#!/bin/sh

# build for iOS / Mac
# changed by 10mitri
# original:
# http://stackoverflow.com/questions/3588904/how-to-link-third-party-libraries-like-fftw3-and-sndfile-to-an-iphone-project-in


# this is the folder where the libs will be generated
export OUTPUT_DIR=ios-libs

# Select toolchains folder
export XCODE_TOOLCHAINS=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain


#$(CURRENT_ARCH)

build_target()
{
PLATFORM=$1
ARCH=$2
SDK_VERSION=$3
CONFIGURE_HOST=$4
IOS_DEPLOYMENT_TARGET=$5

export SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/$PLATFORM.platform/Developer/SDKs/$PLATFORM$SDK_VERSION.sdk

export CPPFLAGS="-I$SDKROOT/usr/include/"
export CFLAGS="$CPPFLAGS -arch $ARCH -isysroot $SDKROOT"
export LD=$XCODE_TOOLCHAINS/usr/bin/ld
export CXX="$XCODE_TOOLCHAINS/usr/bin/clang -arch $ARCH -fembed-bitcode"
export CC="$XCODE_TOOLCHAINS/usr/bin/clang -arch $ARCH -fembed-bitcode"

echo ---------------------------------------------------
echo ---------------------------------------------------
echo ---------------------------------------------------
echo -------------- BUILD TARGET
echo -------------- PLATFORM : $PLATFORM
echo -------------- ARCH : $ARCH
echo -------------- SDK_VERSION : $SDK_VERSION
echo -------------- HOST : $CONFIGURE_HOST
echo -------------- MIN iOS : $IOS_DEPLOYMENT_TARGET
echo -------------- SDK PATH : $SDKROOT
echo ---------------------------------------------------
echo ---------------------------------------------------
echo ---------------------------------------------------

sleep 3

make clean

./configure --host=$CONFIGURE_HOST

make -j4

mkdir $OUTPUT_DIR/$ARCH

# Copy the lib
cp .libs/libfftw3.a $OUTPUT_DIR/$ARCH/libfftw3.a

unset CPPFLAGS CFLAGS LD CXX CC
}


mkdir $OUTPUT_DIR

rm -rf $OUTPUT_DIR/*

# Copy the header file too, just for convenience
cp api/fftw3.h $OUTPUT_DIR/fftw3.h

build_target "iPhoneOS" "armv7" "10.2" "arm-apple-darwin" "9.0"
build_target "iPhoneOS" "armv7s" "10.2" "arm-apple-darwin" "9.0"
build_target "iPhoneOS" "arm64" "10.2" "arm-apple-darwin" "9.0"
build_target "iPhoneSimulator" "x86_64" "10.2" "x86_64-apple-darwin" "9.0"
build_target "iPhoneSimulator" "i386" "10.2" "i386-apple-darwin" "9.0"

#build_target "MacOSX" "x86_64" "10.12" "i386-apple-darwin" "10.10"



回答7:


Based on the answer by 10mitri, working for fftw-3.3.8, iOS SDK 12.2, XCode 10.2.

#!/bin/sh

export XCODE_TOOLCHAINS=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain

export OUTPUT_DIR=ios-libs

mkdir -p $OUTPUT_DIR
rm -rf $OUTPUT_DIR/*

build_target()
{
    PLATFORM=$1
    ARCH=$2
    CONFIGURE_HOST=$3

    IOS_SDKROOT=`xcrun --sdk $PLATFORM --show-sdk-path`

    export CPPFLAGS="-I$IOS_SDKROOT/usr/include/"
    export CFLAGS="$CPPFLAGS -O3 -arch $ARCH -miphoneos-version-min=8.0 -isysroot $IOS_SDKROOT"
    export LD=$XCODE_TOOLCHAINS/usr/bin/ld
    export CXX="$XCODE_TOOLCHAINS/usr/bin/clang -arch $ARCH -fembed-bitcode"
    export CC="$XCODE_TOOLCHAINS/usr/bin/clang -arch $ARCH -fembed-bitcode"

    echo -----------------------------------------
    echo ---- BUILD TARGET
    echo ---- PLATFORM : $PLATFORM
    echo ---- ARCH : $ARCH
    echo ---- HOST : $CONFIGURE_HOST
    echo -----------------------------------------

    sleep 3

    make clean

    ./configure --host=$CONFIGURE_HOST

    make -j4

    # Copy the lib
    cp .libs/libfftw3.a $OUTPUT_DIR/libfftw3_$ARCH.a

    unset CPPFLAGS CFLAGS LD CXX CC
}

build_target "iphoneos" "armv7" "arm-apple-darwin"
build_target "iphoneos" "armv7s" "arm-apple-darwin"
build_target "iphoneos" "arm64" "arm-apple-darwin"
# build_target "iphonesimulator" "x86_64" "x86_64-apple-darwin"
build_target "iphonesimulator" "i386" "i386-apple-darwin"

# Make fat lib
lipo -arch armv7 $OUTPUT_DIR/libfftw3_armv7.a\
     -arch armv7s $OUTPUT_DIR/libfftw3_armv7s.a\
     -arch arm64 $OUTPUT_DIR/libfftw3_arm64.a\
     -arch i386 $OUTPUT_DIR/libfftw3_i386.a\
     -create -output $OUTPUT_DIR/libfftw3_ios.a

# Copy the header file too, just for convenience
cp api/fftw3.h $OUTPUT_DIR/fftw3.h

echo "done"



回答8:


I tried Adam Freeman's script, its awesome but I had to do the following to make it work, so I am here to share my finding. My goal is to make arm based fftw lib so I can build it++ lib through Xcode with arm architecture

I also run into the problem posted by loretoparisi

/libbench2/libbench2.a:5:255: warning: null character ignored [-Wnull-character] 
./libbench2/libbench2.a:4:8: error: source file is not valid UTF-8

the workaround is to strip away the make rule for "tests","tools" folders and any fftw-"wisdom" related stuff in Makefile.in and Makefile.am, I don't know how important are the files from those two folders, but I had to remove them so fftw build can success without UTF-8 error

I also have to modify the script (I took awake the neon and float precision flag, again I also do not know how important are those flag)

#!/bin/sh

# build_lipo.sh
# build an arm64 / armv7s / armv7 / i386 / x86_64 lib of fftw3
# make sure to check that all the paths used in this script exist on your system
#
# adopted from:
# http://robertcarlsen.net/2009/07/15/cross-compiling-for-iphone-dev-884
# changed by Adam
# original: by Nickun
# http://stackoverflow.com/questions/3588904/how-to-link-third-party-libraries-like-fftw3-and-sndfile-to-an-iphone-project-in

# this is the folder where the results of our efforts will end up:
export RESULT_DIR=ios-library

# Select toolchains folder
export XCODE_TOOLCHAINS=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain
# Select the desired iPhone SDK
export DEVROOT_IOS=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
export SDKROOT_IOS=$DEVROOT_IOS/SDKs/iPhoneOS7.1.sdk
# Select the OSX SDK
export DEVROOT_OSX=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer
export SDKROOT_OSX=$DEVROOT_OSX/SDKs/MacOSX10.9.2.sdk

# ------------------------ i386 ---------------------------
# Do it for i386
make clean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP CC LD CXX LDFLAGS CXXFLAGS

export CFLAGS="-arch i386"

# TODO: error checking
./configure --host=i386-apple-darwin9.2.0 --target=i386-apple-darwin9.2.0
make -j2

# Copy the FAT native library to a temporary location
mkdir $RESULT_DIR
cp .libs/libfftw3.a $RESULT_DIR/libfftw3_i386.a
rm -fr .libs/libfftw3.a

# ------------------------ x86_64 ---------------------------
# Do it all again for x86_64
make clean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP CC LD CXX LDFLAGS CXXFLAGS

# TODO: error checking
./configure
make -j2

# Copy the FAT native library to the temporary location
cp .libs/libfftw3.a $RESULT_DIR/libfftw3_x86_64.a
rm -fr .libs/libfftw3.a

# ------------------------ armv7---------------------------
# Do it all again for armv7
make clean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP LD CXX CC LDFLAGS CXXFLAGS

# Set up relevant environment variables
export CPPFLAGS="-I$SDKROOT_IOS/usr/include/ "
export CFLAGS="$CPPFLAGS -arch armv7  -no-cpp-precomp -miphoneos-version-min=6.1 -isysroot $SDKROOT_IOS"
export LD=$XCODE_TOOLCHAINS/usr/bin/ld
export CXX="$XCODE_TOOLCHAINS/usr/bin/clang -x c++ -arch armv7 -std=gnu++11 -stdlib=libc++ "
export CC="$XCODE_TOOLCHAINS/usr/bin/clang -x c -arch armv7 -std=gnu99 "
export CXXFLAGS="$CFLAGS"

# TODO: add custom flags as necessary for package
#  remove '--enable-float' for double precision
#  and take a 'libfftw3.a' file instead
./configure --host=arm-apple-darwin --target=arm-apple-darwin

make -j2

cp .libs/libfftw3.a $RESULT_DIR/libfftw3_armv7.a
rm -fr .libs/libfftw3.a

# Copy the header file too, just for convenience
cp api/fftw3.h $RESULT_DIR/fftw3.h

# ------------------------ armv7s---------------------------
# Do it all again for i386
make clean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP LD CXX CC LDFLAGS CXXFLAGS

# Set up relevant environment variables
export CPPFLAGS="-I$SDKROOT_IOS/usr/include/ "
export CFLAGS="$CPPFLAGS -arch armv7s  -no-cpp-precomp -miphoneos-version-min=6.1 -isysroot $SDKROOT_IOS"
export LD=$XCODE_TOOLCHAINS/usr/bin/ld
export CXX="$XCODE_TOOLCHAINS/usr/bin/clang -x c++ -arch armv7s -std=gnu++11 -stdlib=libc++ "
export CC="$XCODE_TOOLCHAINS/usr/bin/clang -x c -arch armv7s -std=gnu99 "
export CXXFLAGS="$CFLAGS"

# TODO: add custom flags as necessary for package
#  remove '--enable-float' for double precision
#  and take a 'libfftw3.a' file instead
./configure --host=arm-apple-darwin --target=arm-apple-darwin

make -j2

# Copy the ARM library to a temporary location
cp .libs/libfftw3.a $RESULT_DIR/libfftw3_armv7s.a
rm -fr .libs/libfftw3.a

# ------------------------ arm64 ---------------------------
# Do it all again for arm64
make clean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP LD CXX CC LDFLAGS CXXFLAGS

# Set up relevant environment variables
export CPPFLAGS="-I$SDKROOT_IOS/usr/include/ "
export CFLAGS="$CPPFLAGS -arch arm64  -no-cpp-precomp -miphoneos-version-min=6.1 -isysroot $SDKROOT_IOS"
export LD=$XCODE_TOOLCHAINS/usr/bin/ld
export CXX="$XCODE_TOOLCHAINS/usr/bin/clang -x c++ -arch arm64 -std=gnu++11 -stdlib=libc++ "
export CC="$XCODE_TOOLCHAINS/usr/bin/clang -x c -arch arm64 -std=gnu99 "
export CXXFLAGS="$CFLAGS"

# TODO: add custom flags as necessary for package
#  remove '--enable-float' for double precision
#  and take a 'libfftw3.a' file instead
./configure --host=arm-apple-darwin --target=arm-apple-darwin

make -j2

# Copy the ARM library to a temporary location
cp .libs/libfftw3.a ios-library/libfftw3_arm64.a
rm -fr .libs/libfftw3.a

# Create fat lib by combining the two versions
lipo -arch armv7 $RESULT_DIR/libfftw3_armv7.a -arch armv7s $RESULT_DIR/libfftw3_armv7s.a -arch i386 $RESULT_DIR/libfftw3_i386.a -arch x86_64 $RESULT_DIR/libfftw3_x86_64.a -arch arm64 $RESULT_DIR/libfftw3_arm64.a -create -output $RESULT_DIR/libfftw3.a

# Remove intermediate binaries
#rm $RESULT_DIR/libfftw3_armv7.a
#rm $RESULT_DIR/libfftw3_i386.a
#rm $RESULT_DIR/libfftw3_x86_64.a

# Unset used environment variables
unset CPPFLAGS CFLAGS CPP LD LDFLAGS CC CXX CXXFLAGS



回答9:


I've adapted previous scripts to

WORK WITH XCODE7 iOS9.3 MACOSX 10.11 FFTW 3.3.4

#!/bin/sh

# build_lipo.sh
# build an arm64 / armv7s / armv7 / i386 / x86_64 lib of fftw3
# make sure to check that all the paths used in this script exist on your system
#
# adopted from:
# http://robertcarlsen.net/2009/07/15/cross-compiling-for-iphone-dev-884
# changed by garlix
# original: by Nickun
# http://stackoverflow.com/questions/3588904/how-to-link-third-party-libraries-like-fftw3-and-sndfile-to-an-iphone-project-in

######## EDIT HERE ############
export iOS_SDK_VERSION=9.3
export MACOSX_VERSION=10.11
###############################

# this is the folder where the results of our efforts will end up:
export RESULT_DIR=ios-library
export XCODE_DEV_PATH=`xcode-select -print-path`
# Select toolchains folder
export XCODE_TOOLCHAINS=$XCODE_DEV_PATH/Toolchains/XcodeDefault.xctoolchain
# Select the desired iPhone SDK
export DEVROOT_IOS=$XCODE_DEV_PATH/Platforms/iPhoneOS.platform/Developer
export SDKROOT_IOS=$DEVROOT_IOS/SDKs/iPhoneOS$iOS_SDK_VERSION.sdk
# Select the OSX SDK
export DEVROOT_OSX=$XCODE_DEV_PATH/Platforms/MacOSX.platform/Developer
export SDKROOT_OSX=$DEVROOT_OSX/SDKs/MacOSX$MACOSX_VERSION.sdk

export LIB_NAME=libfftw3f

# ------------------------ i386 ---------------------------
# Do it for i386
make clean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP LD CXX LDFLAGS CXXFLAGS

export CFLAGS="-arch i386"

# TODO: error checking
./configure --enable-float --host=i386-apple-darwin9.2.0 --target=i386-apple-darwin9.2.0
make -j2

# Copy the FAT native library to a temporary location
mkdir -p $RESULT_DIR
cp .libs/$LIB_NAME.a $RESULT_DIR/$LIB_NAME\_i386.a

# ------------------------ x86_64 ---------------------------
# Do it all again for x86_64
make clean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP LD CXX LDFLAGS CXXFLAGS

# TODO: error checking
./configure --enable-float
make -j2

# Copy the FAT native library to the temporary location
cp .libs/$LIB_NAME.a $RESULT_DIR/$LIB_NAME\_x86_64.a

# ------------------------ armv7---------------------------
# Do it all again for armv7
make clean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP LD CXX LDFLAGS CXXFLAGS

# Set up relevant environment variables
export CPPFLAGS="-I$SDKROOT_IOS/usr/include/ -mfpu=neon"
export CFLAGS="$CPPFLAGS -arch armv7 -mfpu=neon -no-cpp-precomp -miphoneos-version-min=5.0 -isysroot $SDKROOT_IOS"
export LD=$XCODE_TOOLCHAINS/usr/bin/ld
export CXX="$XCODE_TOOLCHAINS/usr/bin/clang -x c++ -arch armv7 -std=gnu++11 -stdlib=libc++ -mfpu=neon"
export CC="$XCODE_TOOLCHAINS/usr/bin/clang -x c -arch armv7 -std=gnu99 -mfpu=neon"
export CXXFLAGS="$CFLAGS"

# TODO: add custom flags as necessary for package
#  remove '--enable-float' for double precision
#  and take a 'libfftw3.a' file instead
./configure --enable-float --enable-neon --host=arm-apple-darwin --target=arm-apple-darwin

make -j2

cp .libs/$LIB_NAME.a $RESULT_DIR/$LIB_NAME\_armv7.a

# Copy the header file too, just for convenience
cp dft/api/fftw3.h $RESULT_DIR/fftw3.h

# ------------------------ armv7s---------------------------
# Do it all again for i386
make clean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP LD CXX LDFLAGS CXXFLAGS

# Set up relevant environment variables
export CPPFLAGS="-I$SDKROOT_IOS/usr/include/ -mfpu=neon"
export CFLAGS="$CPPFLAGS -arch armv7s -mfpu=neon -no-cpp-precomp -miphoneos-version-min=5.0 -isysroot $SDKROOT_IOS"
export LD=$XCODE_TOOLCHAINS/usr/bin/ld
export CXX="$XCODE_TOOLCHAINS/usr/bin/clang -x c++ -arch armv7s -std=gnu++11 -stdlib=libc++ -mfpu=neon"
export CC="$XCODE_TOOLCHAINS/usr/bin/clang -x c -arch armv7s -std=gnu99 -mfpu=neon"
export CXXFLAGS="$CFLAGS"

# TODO: add custom flags as necessary for package
#  remove '--enable-float' for double precision
#  and take a 'libfftw3.a' file instead
./configure --enable-float --enable-neon --host=arm-apple-darwin --target=arm-apple-darwin
make -j2

# Copy the ARM library to a temporary location
cp .libs/$LIB_NAME.a $RESULT_DIR/$LIB_NAME\_armv7s.a

# ------------------------ arm64 ---------------------------
# Do it all again for arm64
make clean

# Restore default environment variables
unset CPPFLAGS CFLAGS CPP LD CXX LDFLAGS CXXFLAGS

# Set up relevant environment variables
export CPPFLAGS="-I$SDKROOT_IOS/usr/include/ -mfpu=neon"
export CFLAGS="$CPPFLAGS -arch arm64 -mfpu=neon -no-cpp-precomp -miphoneos-version-min=5.0 -isysroot $SDKROOT_IOS"
export LD=$XCODE_TOOLCHAINS/usr/bin/ld
export CXX="$XCODE_TOOLCHAINS/usr/bin/clang -x c++ -arch arm64 -std=gnu++11 -stdlib=libc++ -mfpu=neon"
export CC="$XCODE_TOOLCHAINS/usr/bin/clang -x c -arch arm64 -std=gnu99 -mfpu=neon"
export CXXFLAGS="$CFLAGS"

# TODO: add custom flags as necessary for package
#  remove '--enable-float' for double precision
#  and take a 'libfftw3.a' file instead
./configure --enable-float --enable-neon --host=arm-apple-darwin --target=arm-apple-darwin

make -j2

# Copy the ARM library to a temporary location
cp .libs/$LIB_NAME.a ios-library/$LIB_NAME\_arm64.a


# Create fat lib by combining the two versions
lipo -arch armv7 $RESULT_DIR/$LIB_NAME\_armv7.a -arch armv7s $RESULT_DIR/$LIB_NAME\_armv7s.a -arch i386 $RESULT_DIR/$LIB_NAME\_i386.a -arch x86_64 $RESULT_DIR/$LIB_NAME\_x86_64.a -arch arm64 $RESULT_DIR/$LIB_NAME\_arm64.a -create -output $RESULT_DIR/$LIB_NAME.a

# Remove intermediate binaries
#rm $RESULT_DIR/libfftw3_armv7.a
#rm $RESULT_DIR/libfftw3_i386.a
#rm $RESULT_DIR/libfftw3_x86_64.a

# Unset used environment variables
unset CPPFLAGS CFLAGS CPP LD LDFLAGS CXX CXXFLAGS

According with @Ninji you have to modify Makefile.am

 34c34
 < libbench2 $(CHICKEN_EGG) tests mpi doc tools m4
 ---
 > libbench2 $(CHICKEN_EGG) mpi doc m4
 95,108c95
 < pkgconfig_DATA = fftw3@PREC_SUFFIX@.pc
 < 
 < WISDOM_DIR = /etc/fftw
 < WISDOM = wisdom@PREC_SUFFIX@
 < 
 < WISDOM_TIME=12 # default to 12-hour limit, i.e. overnight
 < WISDOM_FLAGS=--verbose --canonical --time-limit=$(WISDOM_TIME)
 < 
 < wisdom:
 <   tools/fftw@PREC_SUFFIX@-wisdom -o $@ $(WISDOM_FLAGS)
 < 
 < install-wisdom: wisdom
 <   $(mkinstalldirs) $(WISDOM_DIR)
 <   $(INSTALL_DATA) wisdom $(WISDOM_DIR)/$(WISDOM)
 ---
 > pkgconfig_DATA = fftw3@PREC_SUFFIX@.pc
 \ No newline at end of file

and Makefile.in

235c235
 <    libbench2 . threads tests mpi doc tools m4
 ---
 >    libbench2 . threads mpi doc m4
 447c447
 < libbench2 $(CHICKEN_EGG) tests mpi doc tools m4
 ---
 > libbench2 $(CHICKEN_EGG) mpi doc m4
 1053,1058d1052
 < wisdom:
 <    tools/fftw@PREC_SUFFIX@-wisdom -o $@ $(WISDOM_FLAGS)
 < 
 < install-wisdom: wisdom
 <    $(mkinstalldirs) $(WISDOM_DIR)
 <    $(INSTALL_DATA) wisdom $(WISDOM_DIR)/$(WISDOM)


来源:https://stackoverflow.com/questions/3588904/how-do-i-link-third-party-libraries-like-fftw3-and-sndfile-to-an-iphone-project

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!