質問内容
タイトル通りなのですがamd64アーキテクチャ上でarm64アーキテクチャのソースコードをコンパイルする方法が知りたいです。
自分は今ラズベリーパイで実行できるソフトを作りたいのですが、ラズパイ上でコンパイルするとCPU性能の関係でコンパイルに時間がかかります、そこでUbuntu(amd64)上のPCでコンパイルした実行ファイルをラズパイに転送してそこで実行したのですが以下のエラー出てしまい解決方法わかりません
行ったこと5番目が一番近いと思うのですが、どうやるのでしょうか?
知りたいこと
1.ラズパイ4(arm64)で実行する実行ファイルをubuntu(amd64)上でコンパイルしてラズパイ4(arm64)で実行する方法が知りたい.。
2.そもそもコンパイル時間が性能上の関係でかかるから別のパソコンでコンパイルをかけるという行為はナンセンスなのかどうか?正しい行為で一般的なのか知りたい
環境
実行環境: ラズベリーパイ4 OS: ubuntu server for rasberry pi (arm64)
コンパイル環境: ubuntu (amd64)
言語: C++
利用ライブラリ: cpprectsdk,openssl
参考サイト
参考サイト OSファイル:https://downloads.raspberrypi.org/raspios_lite_arm64/images/raspios_lite_arm64-2023-10-10/
参考サイト エラーについて:https://askubuntu.com/questions/470796/fatal-error-sys-cdefs-h-no-such-file-or-directory
参考サイトaarch64-linux-gnu-gccの64bit版を導入:https://eel3.hatenablog.com/entry/2022/08/15/180203
行ったこと
1,/usr/include/cpprest/details/basic_types.h:17:10: fatal error: fstream:
のついて調べましたが有益な情報が得られません。
2,チャットGPTにてコマンドを知りましたどうやらクロスコンパイルならぬ行為をするみたいです。
3,参考サイトのzipファイルを落としてきてlibデータを自分のpcに入れようとしたいのですが.img等拡張子のため断念
4,arm64のライブラリをインストールすることを試みましたがアーキテクチャの不一致でできませんでした。
5,sudo apt-get install gcc-aarch64-linux-gnu
を導入後以下のエラー
$ make aarch64-linux-gnu-gcc obj/Main.o -o bin/program -lcpprest -lssl -lcrypto -pthread /usr/bin/aarch64-linux-gnu-ld: Scrt1.o が見つかりません: そのようなファイルやディレクトリはありません /usr/bin/aarch64-linux-gnu-ld: crti.o が見つかりません: そのようなファイルやディレクトリはありません /usr/bin/aarch64-linux-gnu-ld: obj/Main.o: Relocations in generic ELF (EM: 62) 上記同じため省略 /usr/bin/aarch64-linux-gnu-ld: obj/Main.o: error adding symbols: file in wrong format collect2: error: ld returned 1 exit status make: *** [Makefile:14: bin/program] エラー 1
$ sudo dpkg -i libcpprest2.10_2.10.15-1_arm64.deb [sudo] shigurechan のパスワード: dpkg: アーカイブ libcpprest2.10_2.10.15-1_arm64.deb の処理中にエラーが発生しました (--install): パッケージアーキテクチャ (arm64) がシステム (amd64) と一致しません 処理中にエラーが発生しました: libcpprest2.10_2.10.15-1_arm64.deb
5,ラズパイからlibを引っ張ってきて実験しましたがなんか同じエラー出ます。
発生しているエラーと実行したコマンド
terminal
1$ arm-linux-gnueabihf-g++ -o program Main.cpp -I/usr/include -L/usr/lib -lcpprest -lssl -lcrypto -lboost_system -lboost_thread -lpthread 2In file included from /usr/include/cpprest/asyncrt_utils.h:16, 3 from /usr/include/cpprest/http_client.h:47, 4 from Main.cpp:1: 5/usr/include/cpprest/details/basic_types.h:17:10: fatal error: fstream: そのようなファイルやディレクトリはありません 6 17 | #include <fstream> 7 | ^~~~~~~~~ 8compilation terminated. 9
ソースコード
cpp
1#include <cpprest/http_client.h> 2#include <cpprest/oauth2.h> 3using namespace web; 4using namespace web::http; 5using namespace web::http::client; 6using namespace web::http::oauth2; 7 8int main() { 9 // アクセストークンを取得済みであることを前提としています 10 utility::string_t accessToken = "XXXXXX"; 11 12 // Mastodon APIのエンドポイント 13 utility::string_t apiEndpoint = "https://mstdn.jp/api/v1/instance"; 14 15 try { 16 http_client client(apiEndpoint); 17 http_request request(methods::GET); 18 19 20// Authorizationヘッダーを設定 21 request.headers().add("Authorization", "Bearer " + accessToken); 22 23 client.request(request).then([](http_response response) { 24 if (response.status_code() == status_codes::OK) { 25 // レスポンスを処理 26 std::cout<<response.to_string()<<std::endl; 27 json::value responseData = response.extract_json().get(); 28 // フォロワー情報などを抽出 29 // responseDataから必要な情報を取得 30 } else 31 { 32 // エラーハンドリング 33 std::wcerr << L"APIリクエストエラー: " << response.status_code() << std::endl; 34 } 35 }).wait(); 36 } catch (const std::exception &e) { 37 std::wcerr << e.what() << std::endl; 38 } 39 40 return 0; 41} 42
