linux中由于編譯選項-D_OS64BIT導致的核心已轉儲問題排查解決:
原因:
a.so b.so a.so使用b.so
程序1 程序2 使用a.so
程序1運行正常,程序2啟動后提示核心已轉儲。
程序1和程序2運行的代碼都一致,只執行創建xApplication app;
gdb調試程序2,bt(backtrace)查看崩潰堆棧,異常出現在b.so中,創建xApplication時會創建b.so中的對象。
解決方法:
應該是Makefile編譯選項導致的,對比兩個程序的Makefile;
程序1的Makefile是通過qmake -project生成.pro,然后qmake生成Makefile,編譯出來的程序正常執行;
程序2有Makefile,對比Makefile,發現程序2的Makefile編譯選項中有**-D_OS64BIT**;
去掉程序2Makefile中的-D_OS64BIT,重新編譯后可以正常運行了。
-D_OS64BIT是一個預處理器宏定義,通常用于在代碼中區分32位和64位操作系統環境。
基本用法:
1.在編譯命令中定義
bash/ g++ -D_OS64BIT xxx.cpp -o xxx.o
2.在Qt項目(.pro文件)中定義
qmake/
#添加全局定義
DEFINES += _OS64BIT#或者有條件地定義
contains(QT_ARCH, x86_64) {DEFINES += _OS64BIT
}
實際應用場景
1.平臺相關代碼處理
cpp
#ifdef _OS64BIT// 64位特定代碼using MyInt = int64_t;
#else// 32位代碼using MyInt = int32_t;
#endif
2.內存處理差異
cpp
void* allocateMemory(size_t size){
#ifdef _OS64BIT// 64位操作系統可以使用更大內存return malloc(size*2);
#elsereturn malloc(size);
#endif
}
更好的替代方案
雖然*OS64BIT可用,但更推薦使用標準化的檢測方法:
1.使用編譯器預定義宏
cpp
#if defined(__x86_64__) || defined(__ppc64__) || defined(__arch64__)// 64位系統
#else// 32位系統
#endif
2.使用Qt內置檢測
cpp
#include <QtGlobal>
#if QT_POINTER_SIZE = 8// 64位系統
#else// 32位系統
#endif
常見問題解決
1.宏未生效:
確保編譯命令正確定義了宏
檢查是否有其他地方取消了定義
(#undef OS64BIT)
2.與其它宏沖突:
考慮使用更獨特的宏名,如MYAPP_OS64BIT
3.跨平臺兼容性:
在Windows上可能需要使用WIN64代替。
最佳實踐
1.在頭文件中集中管理平臺相關定義
cpp
// platform_config.h
#if !defined(IS_64BIT)#if defined(__x86_64__) || defined(__ppc64__) || defined(__aarch64__) || defined(_M_X64)#define IS_64BIT 1#else#define IS_64BIT 0#endif
#endif
2.使用靜態斷言驗證:
cpp
static_assert(sizeof(void*)==(IS_64BIT ? 8 : 4), "Pointer sieze mismatch");
3.在構建系統中明確定義:
cmake
#CMake示例
if(CMAKE_SIZEOF_VOID_P EQUAL 8)add_compile_definitions(IS_64BIT=1)
else()add_compile_definitions(IS_64BIT=0)
endif()