iOS Alexa Voice Service SDK 編譯之旅(2)

 

一切都開始於這裏

1.Alexa SDK編譯流程官網地址:https://developer.amazon.com/en-US/docs/alexa/avs-device-sdk/ios.html

2.Alexa SDK github源碼官網地址:https://github.com/alexa/avs-device-sdk

一、Alexa的編譯過程

編譯流程中有一句話要時時注意:

The following step-by-step instructions teach you how to cross-compile and build the AVS Device SDK for iOS. If you encounter any errors or have questions, please check our issues list before creating a new issue. 

請一步步按照流程來編譯,一旦出現問題請停下來檢查和修復問題,不要再繼續往前而導致新的問題產生 。

(1)先決條件

  • curl-7.50.2或者更高
  • Homebrew
  • Xcode command line tools

查看各個版本命令如下:

curl --version
brew --version
xcode-select --version

(2)安裝依賴庫

安裝必需的pkg config

brew install cmake pkg-config

創建編譯項目文件夾

cd ~
mkdir cross-compile
cd cross-compile

拉取CMake(AVS編譯全部都使用CMake命令)

cd ~/cross-compile
git clone https://github.com/leetal/ios-cmake.git

拉取Google Test(說實話,這個東西筆者從來沒用到過)

cd ~/cross-compile
git clone https://github.com/google/googletest.git
mkdir googletest_build

cd googletest_build

cmake ../googletest \
-DIOS_DEPLOYMENT_TARGET=10.0 \
-DCMAKE_TOOLCHAIN_FILE=../ios-cmake/ios.toolchain.cmake \
-DIOS_PLATFORM=OS \

make

下載OpenSSL 和 curl組件庫

cd ~/cross-compile
git clone https://github.com/jasonacox/Build-OpenSSL-cURL.git
cd Build-OpenSSL-cURL/

打開並修改build.sh的版本信息,重點來了,官網給出的建議是如下配置:openSSL是1.0.2l的版本,libcurl是7.55.1的版本,NGHttp2是1.24.0的版本。但是此版本配置後續的cmake無法成功!

########################################
# EDIT this section to Select Versions #
########################################

OPENSSL="1.0.2l"
LIBCURL="7.55.1"
NGHTTP2="1.24.0"

########################################

後續使用的openssl和curl庫的相關內容在官網推薦的版本配置下是無法編譯的,你說坑不坑!?後續cmake命令無法使用當前配置,這裏請多注意!這裏推薦一種配置,openSSL是1.1.1d的版本,libcurl是7.67.0的版本,NGHttp2是1.40.0的版本,確保後續的cmake命令能順利make成功。

OPENSSL="1.0.2l"
LIBCURL="7.55.1"
NGHTTP2="1.24.0"

然後保存,執行build

./build.sh

(3)AVS SDK源碼下載和配置修改

  cd ~/cross-compile
  git clone https://github.com/alexa/avs-device-sdk.git  
  cd avs-device-sdk/

找到文件 /AVSCommon/Utils/src/LibcurlUtils/LibcurlUtils.cpp
替換代碼:這裏解釋一下這個代碼替換後的意思是需要增加證書配置路徑,這個在後續會提及到。

 if (config.getString(CAPATH_CONFIG_KEY, &caPath) &&
     !setopt(handle, CURLOPT_CAPATH, caPath.c_str(), "CURLOPT_CAPATH", caPath.c_str())) {
     return false;
 }

替換後的代碼:

if (config.getString(CAPATH_CONFIG_KEY, &caPath) &&
 !setopt(handle, CURLOPT_CAINFO, caPath.c_str(), "CURLOPT_CAINFO", caPath.c_str()) &&
 !setopt(handle, CURLOPT_CAPATH, caPath.c_str(), "CURLOPT_CAPATH", caPath.c_str())) {
 return false;
 }

採用靜態庫配置: 

  cd ~/cross-compile/avs-device-sdk/
  find . -type f -name '*.txt' -exec sed -i '' s/SHARED/STATIC/ {} +

到這一步爲止,SDK的前期編譯工作就差不多完成了,後續的cmake命令也就成爲了關鍵之處,這裏的坑有點多,需要一條條配置詳細說明。

(4)AVS SDK編譯

我們一條條來分析官網的cmake命令,先說明,這個cmake是無法編譯通過的,後續會一條條改正之後才能編譯通過:

 cd ~/cross-compile
 mkdir avs_build

 cd avs_build

 cmake ../avs-device-sdk
 -DIOS_DEPLOYMENT_TARGET=10.0 \
 -DCMAKE_TOOLCHAIN_FILE=../ios-cmake/ios.toolchain.cmake \
 -DIOS_PLATFORM=OS \
 -DGSTREAMER_MEDIA_PLAYER=OFF \
 -DCURL_LIBRARY=../Build-OpenSSL-cURL/archive/libcurl-7.54.1-openssl-1.0.2l-nghttp2-1.24.0/libcurl_iOS.a \
 -DCURL_INCLUDE_DIR=../Build-OpenSSL-cURL/curl/curl-7.55.1/include \
 -DGTEST_LIBRARY=../googletest_build/googlemock/libgmock.a \
 -DGTEST_MAIN_LIBRARY=../googletest_build/googlemock/libgmock_main.a \
 -DGTEST_INCLUDE_DIR=../googletest/googletest/include/ \
 -DPKG_CONFIG_EXECUTABLE=/usr/local/bin/pkg-config

-DIOS_DEPLOYMENT_TARGET=10.0  這個是指定最低支持的iOS系統版本,官網這裏是指定了10.0系統,這個沒什麼問題。

-DCMAKE_TOOLCHAIN_FILE=../ios-cmake/ios.toolchain.cmake 這個是指定了toolchain中的cmake庫,這個也沒什麼問題。 

-DIOS_PLATFORM=OS 這個是指定平臺爲iOS,也沒問題。

-DGSTREAMER_MEDIA_PLAYER=OFF 這個是指定是否啓用GStreamer,GStreamer是底層用來播放音頻文件的,這個庫非常強大,在iOS上也有安裝的framework,不過這個framework非常大,有2G多,顯然很麻煩,這裏可以開啓和關閉,筆者試過兩種方式都能編譯。不過都需要GStreamer.framework的支持,不是很理解這裏的開關作用是什麼,後續的SDK初始化都需要用到GStreamer的支持。GStreamer在iOS的安裝和應用後續有時間會專門列一章博文講述,這裏按下不表。

-DCURL_LIBRARY=../Build-OpenSSL-cURL/archive/libcurl-7.54.1-openssl-1.0.2l-nghttp2-1.24.0/libcurl_iOS.a 這個配置的意思指定了ibcurl_iOS.a的路徑,這個libcurl_iOS.a要非常注意,如果當前路徑下沒有這個.a庫,需要在自己的電腦上copy這個庫到配置的路徑之下,很好理解,就是要找到這個libcurl_iOS.a。這個地方由於我們修改了libcurl、openssl、nghttp2的版本,路徑問題在後面正確的cmake命令下會給出。這裏官網的配置是有問題的。

-DCURL_INCLUDE_DIR=../Build-OpenSSL-cURL/curl/curl-7.55.1/include 這個配置的意思指定curl的路徑

-DGTEST_LIBRARY=../googletest_build/googlemock/libgmock.a 這個是指定googletest的build庫,這個還沒用到過。

-DGTEST_MAIN_LIBRARY=../googletest_build/googlemock/libgmock_main.a 這個也是指定googletest的庫

-DGTEST_INCLUDE_DIR=../googletest/googletest/include/ 指定googletest的路徑

-DPKG_CONFIG_EXECUTABLE=/usr/local/bin/pkg-config 指定pkg-config的路徑,這個路徑很重要,pkg-config是一個linux下的命令,用於獲得某一個庫或者模塊的所有編譯相關的信息,如果這個路徑找不到的話,cmake命令會報找不到libcrypto的錯誤,後面會詳細講到。

以上就是官網給出的cmake編譯命令,經過無數次測試,按照官網給的命令是99%無法cmake成功的。

 以下是筆者正在使用的cmake配置:

cmake ../avs-device-sdk \
-DIOS_DEPLOYMENT_TARGET=10.0 -Wno-dev \
-DCMAKE_TOOLCHAIN_FILE=../ios-cmake/ios.toolchain.cmake \
-DCMAKE_BUILD_TYPE=DEBUG \
-DACSDK_EMIT_SENSITIVE_LOGS=ON \
-DIOS_PLATFORM=OS \
-DGSTREAMER_MEDIA_PLAYER=ON \
-DCURL_LIBRARY=../Build-OpenSSL-cURL/archive/libcurl-7.67.0-openssl-1.1.1d-nghttp2-1.40.0/libcurl_iOS.a \
-DCURL_INCLUDE_DIR=../Build-OpenSSL-cURL/curl//curl-7.67.0/include \
-DGTEST_LIBRARY=../googletest_build/googlemock/libgmock.a \
-DGTEST_MAIN_LIBRARY=../googletest_build/googlemock/libgmock_main.a \
-DGTEST_INCLUDE_DIR=../googletest/googletest/include/ \
-DPKG_CONFIG_EXECUTABLE=/usr/local/bin/pkg-config

配置解析:

由於筆者修改了libcurl、openssl和nghttp2的版本,相關的路徑也會相應修改。這裏增加了幾條官網並沒有給出的cmake配置,這些都是能否cmake成功的關鍵。

-DIOS_DEPLOYMENT_TARGET=10.0 -Wno-dev 後面增加-Wno-dev,確保在iOS版本平臺上正確運行,推薦加上。

-DCMAKE_BUILD_TYPE=DEBUG 增加SDK的debug模式。在官網AlexaSDK上查看的問題,官方人員幾乎都會說使用debug9來打印相關信息,debug0到debug9的不同日誌輸出,必需使用debug模式才能起作用(SDK初始化會需要傳入debug level),不然sdk編譯成功了之後,使用的時候完全沒運行日誌,這種無奈的心情實在是太過悲傷。

-DACSDK_EMIT_SENSITIVE_LOGS=ON 增加SDK其他敏感日誌,爲以後SDK排查問題提供支撐。

-DCURL_LIBRARY=../Build-OpenSSL-cURL/archive/libcurl-7.67.0-openssl-1.1.1d-nghttp2-1.40.0/libcurl_iOS.a \

-DCURL_INCLUDE_DIR=../Build-OpenSSL-cURL/curl/curl-7.67.0/include \ 這兩條配置項修改了libcurl_iOS.a的路徑和curl的路徑。如果此路徑下找不到libcurl_iOS.a這個文件,需要在電腦上找到這個.a文件,複製到此文件夾下。curl的路徑如果不是這個路徑也需要轉到真正的路徑下。

至此cmake命令應該能夠執行成功了。

(5)cmake報錯

1.這個階段很容易報的一個錯誤是無法找到libcrypto,其實這個libcrypto全稱是libcrypto.pc,需要在自己電腦上找到這個文件,然後export正確的路徑。

-- Checking for module 'libcrypto'

--   No package 'libcrypto’ found

說明PKG_CONFIG_PATH無效,需要export正確的path,如果還是提示這個錯誤,多試試export幾次。

export PKG_CONFIG_PATH=/usr/local/Cellar/openssl/1.0.2o_2/lib/pkgconfig
 

這是github 上SDK的path問題詳解:https://github.com/alexa/avs-device-sdk/issues/1270

附export命令詳解

2.curl/curl.h文件找不到

 

 

 

這個錯誤就是curl的路徑設置錯誤,檢查下
-DCURL_INCLUDE_DIR=../Build-OpenSSL-cURL/curl/curl-7.67.0/include 檢查下路徑配置下是否包含curl文件。

使用筆者cmake配置後,其他無法cmake的情況,敬請留言,筆者看到會一一回復。

cmake配置命令成功之後就是make操作,make操作請看筆者下一篇博文

 

附cmake執行成功的樣式:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章