C與C++混合鏈接靜態(tài)庫

本次主要是將C++的靜態(tài)庫鏈接到一個C的靜態(tài)庫里。編譯環(huán)境是 mingw。

一、x86環(huán)境

1、C++的靜態(tài)庫編譯問題。由于用到了 stl 庫,所以遇到了 string 和bits/c++config.h 找不到的錯誤,解決方法是包含目錄里增加這兩個目錄:

D:\MinGW\x86\lib\gcc\mingw32\4.8.1\include\c++\

D:\MinGW\x86\lib\gcc\mingw32\4.8.1\include\c++\mingw32

2、將C++庫鏈接進(jìn)C時的問題。由于需求完全靜態(tài)鏈接,所以要把C++的標(biāo)準(zhǔn)庫也靜態(tài)鏈接進(jìn)來,最開始使用的是-static-libstdc++ ,沒有成功鏈接上,于是選擇在-Wl,--whole-archive 與-Wl,--no-whole-archive 之間加入 mingw 的C++標(biāo)準(zhǔn)庫具體地址,即:

-Wl,--whole-archive?\

D:/MinGW/x86/lib/gcc/mingw32/4.8.1/libstdc++.a ? ?\

-Wl,--no-whole-archive

二、安卓環(huán)境

1、由于用到了 stl 庫,需要在 Android.mk 里增加一行:

APP_STL?:=?stlport_static

2、由于用到了 stl 庫,所以遇到了 string 和bits/c++config.h 找不到的錯誤,解決方法是包含目錄里增加這三個目錄:

$NDK/sources/cxx-stl/gnu-libstdc++/4.6/include

$NDK/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include

$NDK/sources/cxx-stl/gnu-libstdc++/4.6/lib

其中NDK=D:/Tools/SDK/android-ndk-r9d 。

3、std::string 找不到和error:?undefined?reference?to?'std::_Rb_tree_decrement(std::_Rb_tree_node_base*) 的報(bào)錯,在 Android.mk 里增加:

NDK_ROOT=D:/Tools/SDK/android-ndk-r9d

STL_PATH=$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a

LOCAL_LDLIBS?+=?-L$(STL_PATH)?-lsupc++?\

-lgnustl_static

4、寫build腳本的時候,先編譯新加的庫再編譯 luajit ,以免各種編譯報(bào)錯(暫時未知原因)。

三、iOS環(huán)境

單獨(dú)寫build腳本,將靜態(tài)庫和動態(tài)庫的Armv7和Arm64版本都分別編譯出來之后,使用 libtool 進(jìn)行鏈接即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容