
そこで、32 ビット バイナリだけでなく 64 ビット バイナリとしてもビルドできるようにしたいプロジェクトがあります。
私のマシン自体は 64 ビットであり、64 ビット コンパイルは問題なく動作します。
私はcake
プロジェクトをビルドするために を使用しており、set_target_properties(clib PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")
32 ビット ビルドを強制するために を使用しました。
これをビルドしようとすると、メイン プログラムにインクルードしているため、コンパイラがエラーをスローします。最初は、 内のどこかにインクルードされる が<iostream>
見つからないというエラーが表示されました。オンライン でいくつかの情報を見つけて、システムにインストールしました。これで以前のエラーはなくなりましたが、代わりに に原因があるエラーが発生します 。 <bits/c++config.h>
<iostream>
g++-multilib
/usr/include/linux/errno.h:1:10: fatal error: asm/errno.h: No such file or directory
#include <iostream>
このファイルがどこにあるか確認したところ、見つかりました/usr/include/x86_64-linux-gnu/asm/errno.h
(以前と同様に、c++config.h
フォルダーx86_64
は 32 ビット ビルドでは検索されないようです (これはある程度理にかなっています))。
また、貴重なものと同一の にも見つかりました/usr/include/linux/errno.h
が、ご覧のとおり、asm
サブフォルダーにはありません。
明らかに、手動でそのフォルダーに移動できますが、ここでの設定に何か問題があるような気がします。
では、コード ( を使用) を 32 ビット実行可能ファイルとしてコンパイルできるようにするには、他に何を設定する必要がありますか#include <iostream>
? 標準ライブラリの 32 ビット バージョンのようなものはありますか?
編集:
私はLinux Mint 18.3を使用していますg++ --version
。g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0
cmake v.3.10.2
答え1
さて、問題が何であるかが分かりました。 問題
が分かったので、 を使用する必要がありました。g++-multilib
パッケージ マネージャー (私の場合) で検索しましたsynaptic
。 これには多数のバージョンがリストされていたので、インストールされている のバージョンを確認し、適切なパッケージ (私の場合は )g++
をインストールしました。 g++-multilib
g++-7-multilib
gcc-multilib
しかし、私のケースでは問題の原因と思われるパッケージが インストールされませんでした。そのパッケージをインストールした後は、期待どおりに動作しました。
簡単に言うと、g++-multilib
最初から(名前にバージョンが含まれていない)パッケージをインストールしていれば、この問題は発生しなかったでしょう。