C与C++混合链接静态库

本次主要是将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 进行链接即可。

你可能感兴趣的:(C与C++混合链接静态库)