最近開始學(xué) NDK 編程,踩了不少的坑。
在 Android Studio 中生成 so 文件又兩種方式,一種使用 ndk-build,一種使用 CMake。
使用 ndk-build 可以在 Android.mk 和 Application.mk 文件中,設(shè)置編譯屬性和依賴等。
每一次編譯項目都需要手動執(zhí)行 ndk-build 命令才能生成 so 文件,如果經(jīng)常修改 C 代碼,每次都要重新執(zhí)行命令,很麻煩。
也可以在 Gradle 中增加 ndk 配置,但是這種方式有缺陷。Android Studio 創(chuàng)建項目時推薦使用第二種方式:使用 CMake。
CMake 是一個跨平臺的自動化建構(gòu)系統(tǒng),使用 CMakeLists.txt 來描述構(gòu)建過程。可以產(chǎn)生標(biāo)準的構(gòu)建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces。
于是乎開始了 CMake 的踩坑之旅。找了一本 CMake 實踐 PDF 開始學(xué)習(xí)。
在構(gòu)建動態(tài)庫時生成不了 so 文件。檢查了好幾遍,代碼和配置跟 PDF 中的一模一樣。輸出如下:
MacBook-Pro:build binwin20$ make
Scanning dependencies of target lib
[ 50%] Building C object lib/CMakeFiles/lib.dir/hello.c.o
[100%] Linking C shared library liblib.dylib
[100%] Built target lib
看到 liblib.dylib 文件,挺奇怪的,為啥不是 so 文件呢?然后 在 Sublime 的側(cè)邊欄中找了一下沒找到 liblib.dylib 文件,猜想這可能是個中間文件。
網(wǎng)上各種搜就是找不到答案。最后猜想可能是 Mac 編譯的不是 so 文件。于是乎啟動 Docker 打開 Ubuntu 系統(tǒng),把項目文件夾直接掛載到 Ubuntu 中,真是方便。下載 CMake 花了不少時間。
執(zhí)行 make 命令之后,輸出如下:
root@3eb73a8c9dcc:/myDocker/cmake/t3/build# make
Scanning dependencies of target lib
[ 50%] Building C object lib/CMakeFiles/lib.dir/hello.c.o
[100%] Linking C shared library liblib.so
[100%] Built target lib
發(fā)現(xiàn) Ubuntu 中有生成 so 文件,在 Sublime 的側(cè)邊欄中 還是沒看到 so 文件,坑啊。又繼續(xù)找了好久,沒找到原因,然后猜想,會不會生成到其他地方了呢?于是執(zhí)行了一下 find,
root@3eb73a8c9dcc:/myDocker/cmake/t3/build# find
.
./cmake_install.cmake
./CMakeCache.txt
...
./lib/CMakeFiles/progress.marks
./lib/liblib.so
./lib/Makefile
./Makefile
看到了 liblib.so。這人品,簡直要爆了,要不是項目名 lib 字母排在 CMakeFiles 后面,指不定還要找多久才能找到這個文件呢。
然后看看 Sublime 的側(cè)邊欄 還是沒有 so 文件,一臉蒙蔽。難道 Docker 中的文件都還在虛擬機內(nèi)存中,Mac中看不到?然后在 Mac 中終端里看了一下,有這個文件啊。。。
最后在 Sublime 中 command + ,,果然找到了原因。要是早點讓我看到 liblib.dylib,也不至于被坑這么久啊。
{
"folder_exclude_patterns": [".svn", ".git", ".hg", "CVS"],
"file_exclude_patterns": ["*.pyc", "*.pyo", "*.exe", "*.dll", "*.obj","*.o", "*.a", "*.lib", "*.so", "*.dylib", "*.ncb", "*.sdf", "*.suo", "*.pdb", "*.idb", ".DS_Store", "*.class", "*.psd", "*.db", "*.sublime-workspace"]
}
有時間一定要把《程序員的自我修養(yǎng)》看一遍。