web-dev-qa-db-ja.com

CMakeを使用して32ビットコンパイルを強制する適切な方法

似たような質問がたくさんあることを申し訳ありませんが、CMakeクエリのGooglingは常に同じではないが同じシナリオ、競合するCMakeコマンドなどを生成することがわかります!

32ビットバイナリのみを使用できるライブラリとリンクする必要があるため、プロジェクトで32ビットバイナリをビルドする必要があります。次のようなエラーメッセージに基づいてこれを診断しました。

/usr/bin/ld: i386 architecture of input file `*external-32bit-lib*' is incompatible with i386:x86-64 output

私が収集したものから、したがって、私は使用する必要があります:

set (CMAKE_CXX_FLAGS "-m32")

これは物事を変える-私は今のようないくつかのエラーが表示されます:

/usr/bin/ld: i386 architecture of input file `*project-output-lib*' is incompatible with i386:x86-64 output

また、外部ライブラリでも同じエラーが発生します。 I 思考これは-m32 gccで32ビットバイナリを生成しましたが、ldはまだ64ビット出力を試行していますか?この問題をさらにグーグルで検索しても成功しなかったので、誰かが私が正しいことを確認し、正しいやり方を教えてくれたら、とても感謝しています!

どうもありがとう!

47
devrobf

Cmakeを使用して32ビット用にコンパイルおよびリンクする場合は、ライブラリとバイナリの作成にこれを使用します。

ライブラリの作成:

add_library(mylib SHARED my_source.c)
set_target_properties(mylib PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")

実行可能ファイルの作成:

add_executable(mybin sources.c)
set_target_properties(mybin PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")

お役に立てれば、

40
ant2009

これが余分な作業のように思えても、適切な解決策はこの場合はツールチェーンファイルを使用することだと思います。何かのようなもの:

# the name of the target operating system
set(CMAKE_SYSTEM_NAME Linux)

# which compilers to use for C and C++
set(CMAKE_C_COMPILER gcc)
set(CMAKE_C_FLAGS -m32)
set(CMAKE_CXX_COMPILER g++)
set(CMAKE_CXX_FLAGS -m32)

# here is the target environment located
set(CMAKE_FIND_ROOT_PATH   /usr/i486-linux-gnu )

# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search
# programs in the Host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

使用方法は次のとおりです。

$ cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake /path/to/source

ここで重要なのは、ルートディレクトリパス(CMAKE_FIND_ROOT_PATH)サードパーティのライブラリを検索するために使用する必要があります。実際、コンパイラはx86_64システム上のx86 Qtライブラリを検索する場所を知るほど賢くないかもしれません。

ツールチェーンファイルがあると、コンパイラーごとに別のファイルを指定できます。また、Windows環境から32ビットでコンパイルするときにオプションを微調整できるはずです。

X86_64 Linux OSからの32ビットのコンパイルは非常に簡単なので、今日ではこれは特別な作業ですが、このソリューションは他のよりエキゾチックなセットアップでも機能します。

ツールチェーンファイルの詳細については、たとえば以下を確認できます。

17
malat

CMAKE_CXX_FLAGSはC++コンパイラにのみ影響します。また、おそらくCコンパイラのフラグを設定する必要があります。

set (CMAKE_C_FLAGS "-m32")
8
sakra

M32をLFLAGSに渡さなかったか、古いobjファイルが動揺しているようです。最初に掃除してください。

この質問はあなたのものに似ています: cmake、gcc、cuda and -m32

4
Fredrik E

つかいます - TRY_RUN 次のソースによるコマンド。

size.cpp:

#include <cstdlib>

int main( int argc, char** argv )
{
  size_t size = sizeof(void*);
  if ( size == 4 )
    return 0;
  return 1;
}

CMakeLists.txt:

TRY_RUN(RUN_RESULT_VAR COMPILE_RESULT_VAR ${your_temp_dir} size.cpp RUN_OUTPUT_VARIABLE IS_64_SYSTEM)
IF(IS_64_SYSTEM)
  MESSAGE(FATAL_ERROR "64 compiling not allowed!")
ENDIF(IS_64_SYSTEM)

すべての標準コンパイラで動作します。

3
Naszta

Malatのアプローチを使用して、Toolchainファイルを作成しました。

Linuxの一部で動作するToolchainファイルがあります。おそらくインスピレーションを与えるでしょう。それはあなたのためにそのまま働くかもしれません、またはあなたが仕事またはw/eに依存している他のcmakeスクリプトを取得するために他のいハックが必要な場合があります:

https://github.com/visualboyadvance-m/visualboyadvance-m/blob/master/cmake/Toolchain-cross-m32.cmake

1
Rafael Kitover