qt for android release gcc
问题:
包含 store.lockfree.queue, 用 qt 5.5.1 编译 android release 版本的程序,在运行时就会出现:
F libc : Fatal signal 7 (SIGBUS), code 1, fault addr 0x9da51154 in tid 25836 (.example.lproxy)
"org.qtproject.example.lproxy" died.
此时,程序尚未进入 qt.main 函数, 看来是全局区(静态区)出了问题。但是 编译 debug 版本的 android 程序,则运行正常,很奇怪的现象。其他平台:win32/linux 不管是 debug 还是 release 也都不会出现这个问题。
qt android release 的 gcc 编译指令示例:
D:\Qt\android\android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++ \
-c -Wno-psabi \
-march=armv7-a -mfloat-abi=softfp -mfpu=vfp -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums \
-DANDROID -Wa,--noexecstack -fno-builtin-memmove \
-std=c++11 -pthread -O2 -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -mthumb \
-Wall -Wno-psabi -W -D_REENTRANT -fPIC -DLOG_LOCKFREE_QUEUE -D_REENTRANT -DBOOST_REGEX_NO_LIB -DBOOST_DATE_TIME_SOURCE -DBOOST_SYSTEM_NO_LIB -DQT_NO_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_WEBSOCKETS_LIB -DQT_NETWORK_LIB -DQT_WEBCHANNEL_LIB -DQT_CORE_LIB -I../lproxy-local-test -I. -I../lproxy-local-test/lproxy/contrib/boost/boost_1_57_0 -I../lproxy-local-test/lproxy/contrib/cryptopp -I../lproxy-local-test/lproxy/src/core -I../lproxy-local-test/lproxy/src/core/boost_build -ID:/Qt/QtDev/5.5/android_armv7/include -ID:/Qt/QtDev/5.5/android_armv7/include/QtQuick -ID:/Qt/QtDev/5.5/android_armv7/include/QtGui -ID:/Qt/QtDev/5.5/android_armv7/include/QtQml -ID:/Qt/QtDev/5.5/android_armv7/include/QtWebSockets -ID:/Qt/QtDev/5.5/android_armv7/include/QtNetwork -ID:/Qt/QtDev/5.5/android_armv7/include/QtWebChannel -ID:/Qt/QtDev/5.5/android_armv7/include/QtCore -I. -isystem D:/Qt/android/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.9/include -isystem D:/Qt/android/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include -isystem D:/Qt/android/android-ndk-r10e/platforms/android-9/arch-arm/usr/include -ID:/Qt/QtDev/5.5/android_armv7/mkspecs/android-g++ -o websocketclientwrapper.obj ../lproxy-local-test/websocketchannel/websocketclientwrapper.cpp
而 debug 是没问题的:
D:\Qt\android\android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++ \
-c -Wno-psabi \
-march=armv7-a -mfloat-abi=softfp -mfpu=vfp -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums \
-DANDROID -Wa,--noexecstack -fno-builtin-memmove \
-std=c++11 -pthread -g -g -marm -O0 -fno-omit-frame-pointer \
-Wall -Wno-psabi -W -D_REENTRANT -fPIC -DLOG_LOCKFREE_QUEUE -D_REENTRANT -DBOOST_REGEX_NO_LIB -DBOOST_DATE_TIME_SOURCE -DBOOST_SYSTEM_NO_LIB -DQT_QML_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_WEBSOCKETS_LIB -DQT_NETWORK_LIB -DQT_WEBCHANNEL_LIB -DQT_CORE_LIB -I../lproxy-local-test -I. -I../lproxy-local-test/lproxy/contrib/boost/boost_1_57_0 -I../lproxy-local-test/lproxy/contrib/cryptopp -I../lproxy-local-test/lproxy/src/core -I../lproxy-local-test/lproxy/src/core/boost_build -ID:/Qt/QtDev/5.5/android_armv7/include -ID:/Qt/QtDev/5.5/android_armv7/include/QtQuick -ID:/Qt/QtDev/5.5/android_armv7/include/QtGui -ID:/Qt/QtDev/5.5/android_armv7/include/QtQml -ID:/Qt/QtDev/5.5/android_armv7/include/QtWebSockets -ID:/Qt/QtDev/5.5/android_armv7/include/QtNetwork -ID:/Qt/QtDev/5.5/android_armv7/include/QtWebChannel -ID:/Qt/QtDev/5.5/android_armv7/include/QtCore -I. -isystem D:/Qt/android/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.9/include -isystem D:/Qt/android/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include -isystem D:/Qt/android/android-ndk-r10e/platforms/android-9/arch-arm/usr/include -ID:/Qt/QtDev/5.5/android_armv7/mkspecs/android-g++ -o webchannelobject.obj ../lproxy-local-test/webchannelobject/webchannelobject.cpp
release 和 debug 链接指令相同。
最终定位到问题代码 store.h
#include <boost/lockfree/queue.hpp>
template <typename T>
class Store<T, boost::lockfree::queue<T> > :
public boost::serialization::singleton<
Store<T, boost::lockfree::queue<T> > >,
public boost::lockfree::queue<T> {
public:
//using boost::lockfree::queue<T>::push;
//using boost::lockfree::queue<T>::pop;
typedef boost::lockfree::queue<T> BASETYPE;
bool push(const T* element_ptr) {
if (element_ptr) {
return this->push(*element_ptr);
}
else {
return false;
}
}
bool push(const T& element) {
return BASETYPE::push(element);
}
bool pop(T* element_ptr) {
if (element_ptr) {
return this->pop(*element_ptr);
}
else {
return false;
}
}
bool pop(T& element) {
return BASETYPE::pop(element);
}
// 继承父类的reserve
//void reserve(size_t);
//void reserve_unsafe(size_t);
protected:
Store(size_t _capacity = __STORECAPACITY__s) :
boost::lockfree::queue<T>(_capacity) {}
Store(const Store&) {}
private:
// 屏蔽下面接口
size_t size() const { return 0; }
bool full() const { return false; }
};
对两个基类虚继承也照旧同一个问题。
gcc 版本
D:\Qt\android\android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++ --version
arm-linux-androideabi-g++ (GCC) 4.9 20140827 (prerelease)
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Android 版本:
Android 6.0 ABI:armeabi-v7a
解决办法:去掉 public boost::serialization::singleton<Store<T, boost::lockfree::queue<T> > > , 改用单继承。
更深层次的原因不详,有可能和 boost::serialization::singleton 有关,也可能和 boost::lockfree 有关,也可能和内存字节对齐有关。
qt for android release gcc
问题:
包含 store.lockfree.queue, 用 qt 5.5.1 编译 android
release版本的程序,在运行时就会出现:此时,程序尚未进入 qt.main 函数, 看来是全局区(静态区)出了问题。但是 编译
debug版本的 android 程序,则运行正常,很奇怪的现象。其他平台:win32/linux 不管是 debug 还是 release 也都不会出现这个问题。qt android
release的 gcc 编译指令示例:而
debug是没问题的:release 和 debug 链接指令相同。
最终定位到问题代码 store.h
对两个基类虚继承也照旧同一个问题。
gcc 版本
Android 版本:
Android 6.0 ABI:armeabi-v7a
解决办法:去掉
public boost::serialization::singleton<Store<T, boost::lockfree::queue<T> > >, 改用单继承。更深层次的原因不详,有可能和
boost::serialization::singleton有关,也可能和boost::lockfree有关,也可能和内存字节对齐有关。