我正在尝试将第三方库(如fftw3和sndfile)链接到Xcode3.2中的iPhone项目。我通过在项目构建配置下将“Header Search Path”设置为“/ usr / local / include”并将“Other Linker Flags”设置为“-lfftw3 -lsndfile”,使其在常规Mac项目中工作。但是,当我尝试使用相同的设置在iPhone项目中构建它时,它给出了“找不到-lfftw3的库”和退出代码1错误消息。
苹果不允许在iPhone上使用此功能吗?有办法解决这个问题吗?
答案 0 :(得分:6)
我已经为IOS 5.0+修改了Epskampie的脚本 与OS X 10.7上的fftw3.3.3一起使用,带有IOS SDK 6.0和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
答案 1 :(得分:5)
为了编译fftw3以便在iOS项目中使用,我已经改编了这里发布的脚本: http://robertcarlsen.net/2009/07/15/cross-compiling-for-iphone-dev-884
在带有iOs SDK 3.2的OS X 10.6上与fftw3.2.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
从包含fftw3的目录运行此脚本。您需要的文件应该最终放在ios-library文件夹中。
答案 2 :(得分:2)
您需要将库构建为通用静态库。这个过程因库而异,但通常都是这样的。
步骤1通常是最棘手的,因为许多库具有不同的构建过程。通常通过设置正确的编译器标志来使用iphone sdk而不是系统范围的编译器来完成。
答案 3 :(得分:2)
我为Mac OS X 10.9.2,iOS 7.1,fftw-3.3.4修改了Nickun的脚本。它还为fat文件添加了一个arm64切片。这是脚本 - >
#!/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
答案 4 :(得分:1)
并不是Apple不允许使用该库,而是您链接的版本是x86,因此它无法在iPhone上运行。您需要使用iPhone SDK构建库,然后链接到该版本。
或者,您可能会有点顽皮,并在主项目中包含第三方来源。顽皮,但它会证明苹果不会阻止你,并显示图书馆是否会在手机上运行OK。
将代码保存在单独构建的库项目中会更清晰。
答案 5 :(得分:1)
为iOS构建FFTW3:
这是一个为不同iOS架构(设备,模拟器......)创建.h和.a文件的脚本
享受它!
Q.some
答案 6 :(得分:0)
我尝试了亚当弗里曼的剧本,它很棒,但是我必须做以下工作才能使它工作, 所以我在这里分享我的发现。我的目标是制作基于arm的fftw lib,这样我就可以通过带有arm架构的Xcode构建它的++ lib
我也遇到了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
解决方法是去除"测试","工具"的制作规则。文件夹和任何fftw - "智慧" Makefile.in和Makefile.am中的相关内容,我不知道这两个文件夹中的文件有多重要,但我不得不将它们删除,因此fftw build可以成功而不会出现UTF-8错误
我还要修改脚本(我唤醒了霓虹灯和浮动精度标志,再次我也不知道那些标志有多重要)
#!/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
答案 7 :(得分:0)
我已将之前的脚本改编为
#!/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
根据@Ninji,你必须修改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
和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)
答案 8 :(得分:0)
基于10mitri的回答,适用于 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"