我一直在嘗試創建一個跨平臺專案。需要構建 32 位和 64 位二進制文??件 (dll)。我正在使用 Visual Studio 并選擇 x86-Release 或 x64-Release 解決了 Windows 的問題。
但是對于 linux,它總是構建 64 位二進制文??件。
經過搜索,我發現需要安裝 g multilib 并且需要將 -m32 標志傳遞給編譯器和聯結器。我找到
set_target_properties(PROJECT_NAME PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")
將解決問題。
所以為了構建一個 32 位的 linux 二進制檔案(以 .so 結尾的 MODULE),我添加了上面的代碼。
我在上面的代碼下面也有這個代碼
if(WIN32)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
message("WIN32 x64")
else()
message("WIN32 x32")
endif()
else(WIN32)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
message("LINUX x64")
else()
message("LINUX x32")
endif()
endif(WIN32)
但是,它輸出
1> [CMake] LINUX x64
所以它仍在構建 32 位版本。
我同時安裝了 g 和 g multilib,但不確定 Visual Studio 呼叫的是哪一個。這可能是問題嗎?
uj5u.com熱心網友回復:
正如評論中提到的,發現 CMAKE_SIZEOF_VOID_P 無法檢測是否通過了 m32 標志。所以我修改了這樣的代碼
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(OUTPUT_BITNESS 64)
else()
set(OUTPUT_BITNESS 32)
endif()
if(FORCE_32)
set_target_properties(PROJECT_NAME PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")
set(OUTPUT_BITNESS 32)
endif()
if(WIN32)
if(OUTPUT_BITNESS EQUAL 64)
message("WIN32 x64")
else()
message("WIN32 x32")
endif()
else(WIN32)
if(OUTPUT_BITNESS EQUAL 64)
message("LINUX x64")
else()
message("LINUX x32")
endif()
endif(WIN32
所以要編譯為 32 位,FORCE_32 變數必須設定為 1。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/454320.html
下一篇:什么是休眠中的事務邊界
