2013-10-18 66 views
7

VAMP插件由倫敦大學瑪麗皇后學院是BSD的一個驚人的收藏授權的軟件。所有這些插件都是基於Sonic Visualizer軟件的 A plug Sdk來構建插件也是可用的。如何編譯VAMP插件到iOS的ARMv7

您可以建立OSX/Linux的/ Win32的目標的插件。

女王大學沃爾瑪也解釋了here插件架構以及如何構建在上述指定不同的平臺。

一個Java版本,jVamp是可用的。一個Python包裝也。

但是,如何構建iOS平臺?

所以,我試圖移植Makefile來了iOS。

首先,我改變了文件

build/osx/Makefile.osx 

這樣:

CFLAGS := -O3 -ftree-vectorize -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -arch x86_64 -I../vamp-plugin-sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers/ -DUSE_PTHREADS 

CXXFLAGS := $(CFLAGS) 

LDFLAGS := -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -arch x86_64 -lqm-dsp ../vamp-plugin-sdk/libvamp-sdk.a -framework Accelerate -lpthread -exported_symbols_list=vamp-plugin.list -install_name qm-vamp-plugins.a 

PLUGIN_EXT := .a 

include build/general/Makefile.inc 

然後建立

macbookproloreto:qm-vamp-plugins loreto$ make -f build/osx/Makefile.osx 
cc -O3 -ftree-vectorize -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -arch x86_64 -I../vamp-plugin-sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers/ -DUSE_PTHREADS -I. -I../qm-dsp -c -o g2cstubs.o g2cstubs.c 
c++ -O3 -ftree-vectorize -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -arch x86_64 -I../vamp-plugin-sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers/ -DUSE_PTHREADS -I. -I../qm-dsp -c -o plugins/AdaptiveSpectrogram.o plugins/AdaptiveSpectrogram.cpp 
In file included from plugins/AdaptiveSpectrogram.cpp:15: 
In file included from plugins/AdaptiveSpectrogram.h:18: 
In file included from ../vamp-plugin-sdk/vamp-sdk/Plugin.h:40: 
In file included from /usr/bin/../lib/c++/v1/string:430: 
In file included from /usr/bin/../lib/c++/v1/iosfwd:90: 
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/wchar.h:70: 
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/_types.h:27: 
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/sys/_types.h:32: 
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/sys/cdefs.h:655:2: **error: Unsupported 
     architecture 
#error Unsupported architecture 
^** 

這裏的第一個問題是,有一個不支持的架構。

所以插件所依賴的SDK我必須首先建立一個上:因爲我沒有OGG/VORBIS庫,但是沒有LOGG庫發生

cd /Users/loreto/Projects/AUDIO/VAMP/vamp-plugin-sdk 
make -f build/Makefile.osx 

不同的錯誤。所以我稍微修改了Makefile.osx,刪除了HOST_LIB標誌中的這些依賴關係。我必須保持libsndfile反正:

HOST_LIBS  = ./libvamp-hostsdk.a -L../10.8/inst/lib -lsndfile -ldl 

所以我能夠在這裏建立的靜態庫:

macbookproloreto:vamp-plugin-sdk loreto$ ls -l *.a 
-rw-r--r-- 1 loreto staff 709840 17 Ott 23:56 libvamp-hostsdk.a 
-rw-r--r-- 1 loreto staff 183720 17 Ott 23:56 libvamp-sdk.a 

當然這些靜態庫有針對性地拱x86_64的,所以我需要添加的ARMv7弓:

ARCHFLAGS = -mmacosx-version-min=$(MINVERSION) -arch x86_64 -arch armv7 

然後使清潔和重新編譯

macbookproloreto:vamp-plugin-sdk loreto$ make -f build/Makefile.osx clean 
macbookproloreto:vamp-plugin-sdk loreto$ make -f build/Makefile.osx 
c++ -mmacosx-version-min=10.8 -arch x86_64 -arch armv7 -O2 -Wall -I. -I../10.8/inst/include -fPIC -c -o src/vamp-sdk/PluginAdapter.o src/vamp-sdk/PluginAdapter.cpp 
In file included from src/vamp-sdk/PluginAdapter.cpp:37: 
In file included from ./vamp-sdk/PluginAdapter.h:40: 
In file included from /usr/include/c++/4.2.1/map:64: 
In file included from /usr/include/c++/4.2.1/bits/stl_tree.h:68: 
In file included from /usr/include/c++/4.2.1/bits/stl_algobase.h:65: 
In file included from /usr/include/c++/4.2.1/bits/c++config.h:41: 
In file included from /usr/include/c++/4.2.1/bits/os_defines.h:61: 
In file included from /usr/include/unistd.h:71: 
In file included from /usr/include/_types.h:27: 
In file included from /usr/include/sys/_types.h:33: 
/usr/include/machine/_types.h:34:10: fatal error: 'arm/_types.h' file not found 
#include "arm/_types.h" 
     ^
1 error generated. 
make: *** [src/vamp-sdk/PluginAdapter.o] Error 1 

找不到臂的類型定義!這裏的問題是,在正確的道路是

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/arm/_types.h 

好吧,讓我們再解決這個問題的Makefile.osx:

ARCHFLAGS = -mmacosx-version-min=$(MINVERSION) -arch armv7 
CFLAGS   = $(ARCHFLAGS) -fPIC --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -isystem /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/ 
CXXFLAGS  = $(ARCHFLAGS) -O2 -Wall -I. -fPIC 
CPPFLAGS  ="-pipe -no-cpp-precomp -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/" -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk 

然後進行靜態目標:

make -f build/Makefile.osx sdkstatic 

哇它成功了!我有一個vamp主機sdk .a for iOS!(我想有假設)

macbookproloreto:vamp-plugin-sdk loreto$ ls -l *.a 
-rw-r--r-- 1 loreto staff 301176 18 Ott 00:35 libvamp-hostsdk.a 
-rw-r--r-- 1 loreto staff 76024 18 Ott 00:35 libvamp-sdk.a 

好的,但是讓與otool檢查,因爲你永遠不知道:

macbookproloreto:vamp-plugin-sdk loreto$ otool -hv libvamp-sdk.a 
Archive : libvamp-sdk.a 
libvamp-sdk.a(PluginAdapter.o): 
Mach header 
     magic cputype cpusubtype caps filetype ncmds sizeofcmds  flags 
    MH_MAGIC  ARM   V7 0x00  OBJECT  4  1128 SUBSECTIONS_VIA_SYMBOLS 
libvamp-sdk.a(RealTime.o): 
Mach header 
     magic cputype cpusubtype caps filetype ncmds sizeofcmds  flags 
    MH_MAGIC  ARM   V7 0x00  OBJECT  4  1060 SUBSECTIONS_VIA_SYMBOLS 
libvamp-sdk.a(FFT.o): 
Mach header 
     magic cputype cpusubtype caps filetype ncmds sizeofcmds  flags 
    MH_MAGIC  ARM   V7 0x00  OBJECT  4  584 SUBSECTIONS_VIA_SYMBOLS 
libvamp-sdk.a(acsymbols.o): 
Mach header 
     magic cputype cpusubtype caps filetype ncmds sizeofcmds  flags 
    MH_MAGIC  ARM   V7 0x00  OBJECT  3  500 SUBSECTIONS_VIA_SYMBOLS 

好吧,這是ARMv7架構。

現在,回到插件再次SDK和改變

build/osx/Makefile.osx 

如下:

CFLAGS := -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/ -DUSE_PTHREADS 

CXXFLAGS := $(CFLAGS) 

include build/general/Makefile.inc 

好了再回來,使:

macbookproloreto:dsp loreto$ make -f build/osx/Makefile.osx 

轟!另一個問題:

/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/ -DUSE_PTHREADS -I. -c -o dsp/wavelet/Wavelet.o dsp/wavelet/Wavelet.cpp 
cc -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/ -DUSE_PTHREADS -I. -c -o hmm/hmm.o hmm/hmm.c 
hmm/hmm.c:21:10: fatal error: 'clapack.h' file not found 
#include <clapack.h>   /* LAPACK for matrix inversion */ 
     ^
1 error generated. 
make: *** [hmm/hmm.o] Error 1 
macbookproloreto:dsp loreto$ vi build/osx/Makefile.osx 

未找到LAPACK。

但是至於Apple Docs here,蘋果在iOS4.0以後在Accelerate.frameworks中引入了LAPACK!

其實clapack.h是在這裏: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/Frameworks/Accelerate.framework/框架/ vecLib.framework /頭/ clapack.h

因此,讓我們添加此某處../dsp/build/Makefile.osx

CFLAGS := -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include/ -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers/ -DUSE_PTHREADS 

現在讓我們再次做到,但讓我檢查拱門:

macbookproloreto:dsp loreto$ otool -hv libqm-dsp.a 
Archive : libqm-dsp.a 
libqm-dsp.a(Pitch.o): 
Mach header 
     magic cputype cpusubtype caps filetype ncmds sizeofcmds  flags 
    MH_MAGIC  ARM   V7 0x00  OBJECT  4  516 SUBSECTIONS_VIA_SYMBOLS 
libqm-dsp.a(Chromagram.o): 
Mach header 

聽起來不錯!一級回到現在的插件文件夾,並

In file included from plugins/AdaptiveSpectrogram.cpp:15: 
plugins/AdaptiveSpectrogram.h:22:10: fatal error: 'dsp/transforms/FFT.h' file not found 
#include <dsp/transforms/FFT.h> 
     ^
1 error generated. 

嗯ok了DSP /錯過了tranforms文件夾 - 天哪!

另一個錯誤:

clang: error: invalid argument '-install_name qm-vamp-plugins.a' only allowed with '-dynamiclib' 
make: *** [qm-vamp-plugins.a] Error 1 

讓我們再次修復Makefile.osx:

CFLAGS := -O3 -ftree-vectorize -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -arch armv7 -I../vamp-plugin-sdk -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers/ -DUSE_PTHREADS 

CXXFLAGS := $(CFLAGS) 

LDFLAGS := -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -arch armv7 -lqm-dsp ../vamp-plugin-sdk/libvamp-sdk.a -framework Accelerate -lpthread 

好了,現在的錯誤是結構未定義符號錯誤:長期看要點here 這樣的:

"std::cerr", referenced from: 
    "typeinfo for std::istream", referenced from: 
    "std::ostream::put(char)"" 
    std::ostream::operator<<(int)", 

這讓我想起了boost C++庫!

所以我需要得到提升,爲iOS編譯然後將其包含在Makefile中,它應該工作,不是嗎?這可能需要很長時間...

所以做到這一點現在

macbookproloreto:vamp-plugin-sdk loreto$ echo $'\360\237\215\272' 

http://i.stack.imgur.com/ff3kp.png

here獲得提振,因爲iOS的框架,分配和增加

-I /用戶/洛雷託/項目/ AUDIO/LIBS /升壓後-ios/Dist/boost.framework/Headers/

我有同樣的錯誤...呃我想我錯過了標準C++庫這裏!

macbookproloreto:Headers loreto$ locate libc++.dylib | grep iPhoneOS7.0 
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/lib/libc++.dylib 

賓果!

如此反覆

-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/lib/libc++.dylib 

錯誤(DOH)!

試圖用一個非常簡單的關聯問題沒有成功

-I/usr/lib/libstdc++.dylib 
    -lstdc++ 

Stucked。

再次。

macbookproloreto:vamp-plugin-sdk loreto$ echo $'\360\237\215\272' 

http://i.stack.imgur.com/ff3kp.png

錯誤的最有趣的部分是被編譯的第一靜態庫:

make -f build/osx/Makefile.osx 

c++ -o qm-vamp-plugins.a g2cstubs.o plugins/AdaptiveSpectrogram.o plugins/BarBeatTrack.o plugins/BeatTrack.o plugins/DWT.o plugins/OnsetDetect.o plugins/ChromagramPlugin.o plugins/ConstantQSpectrogram.o plugins/KeyDetect.o plugins/MFCCPlugin.o plugins/SegmenterPlugin.o plugins/SimilarityPlugin.o plugins/TonalChangeDetect.o plugins/Transcription.o libmain.o -L../qm-dsp -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -arch armv7 -lqm-dsp ../vamp-plugin-sdk/libvamp-sdk.a -framework Accelerate -lpthread 
Undefined symbols for architecture armv7: 
    "std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const", referenced from: 
     _VampPlugin::Vamp::RealTime::toString() const in libvamp-sdk.a(RealTime.o) 
     _VampPlugin::Vamp::RealTime::toText(bool) const in libvamp-sdk.a(RealTime.o) 
    "std::basic_ios<char, std::char_traits<char> >::widen(char) const", referenced from: 
     _VampPlugin::Vamp::PluginAdapterBase::Impl::getDescriptor() in libvamp-sdk.a(PluginAdapter.o) 

在這裏我們可以看到,編譯不包含正確的靜態庫之一建築。

我這裏有兩個靜態庫:

lqm-dsp ../vamp-plugin-sdk/libvamp-sdk.a 

如果我在運行otool我可以看到,CPU時間是ARM7對他們倆的:

macbookproloreto:qm-vamp-plugins loreto$ otool -hv ../vamp-plugin-sdk/libvamp-sdk.a 
Archive : ../vamp-plugin-sdk/libvamp-sdk.a 
../vamp-plugin-sdk/libvamp-sdk.a(PluginAdapter.o): 
Mach header 
     magic cputype cpusubtype caps filetype ncmds sizeofcmds  flags 
    MH_MAGIC  ARM   V7 0x00  OBJECT  4  1128 SUBSECTIONS_VIA_SYMBOLS 

那麼什麼是此事開發人員/ SDKs/iPhoneOS7.0.sdk/usr/lib/libC++。dylib?

+1

如果你成功創建了它,你可以請把iOS庫聯機嗎? – jarryd

+2

是的!只要我有所有的工作,我會在接下來的日子裏上網。我將要有armv7和armv7s。 – loretoparisi

+1

太棒了! :) – jarryd

回答

2

嘗試在代碼中評論標準庫的用法。

它可能只用於調試。