本次主要是将C++的静态库链接到一个C的静态库里。编译环境是 mingw。
一、x86环境
1、C++的静态库编译问题。由于用到了 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++库链接进C时的问题。由于需求完全静态链接,所以要把C++的标准库也静态链接进来,最开始使用的是-static-libstdc++ ,没有成功链接上,于是选择在-Wl,--whole-archive 与-Wl,--no-whole-archive 之间加入 mingw 的C++标准库具体地址,即:
-Wl,--whole-archive \
D:/MinGW/x86/lib/gcc/mingw32/4.8.1/libstdc++.a \
-Wl,--no-whole-archive
二、安卓环境
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*) 的报错,在 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 ,以免各种编译报错(暂时未知原因)。
三、iOS环境
单独写build脚本,将静态库和动态库的Armv7和Arm64版本都分别编译出来之后,使用 libtool 进行链接即可。