一切都開始於這裏
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
2.curl/curl.h文件找不到
這個錯誤就是curl的路徑設置錯誤,檢查下
-DCURL_INCLUDE_DIR=../Build-OpenSSL-cURL/curl/curl-7.67.0/include 檢查下路徑配置下是否包含curl文件。
使用筆者cmake配置後,其他無法cmake的情況,敬請留言,筆者看到會一一回復。
cmake配置命令成功之後就是make操作,make操作請看筆者下一篇博文。
附cmake執行成功的樣式: