2013-05-14 46 views
6

This bài đăng thực sự cung cấp thông tin về những gì tôi đang cố gắng đạt được. Tôi đã tạo một tệp nhị phân HelloUnix đơn giản.Làm thế nào để chạy một nhị phân biên dịch Ghc trên các máy khác?

$ echo 'main = putStrLn "Hello Unix"' > HelloUnix.hs 
$ ghc -static --make HelloUnix.hs 

nào tạo ra một nhị phân HelloUnix, tôi đã hy vọng với tất cả mọi thứ -static cờ được đóng gói lên bên trong nhị phân để tất cả là cần thiết để chạy các nhị phân là tập tin đó. Tôi đã chuyển nhị phân sang một máy unix khác, đảm bảo rằng tệp có đặc quyền truy cập chính xác qua chmod. Đã chạy nhị phân nhưng lỗi này hiển thị

bash: ./HelloUnix: cannot execute binary file 

Bất kỳ ý tưởng nào về cách gỡ lỗi này?

EDIT: Tôi hiện đang cố gắng phát triển một hệ thống phân tán, do đó hy vọng chỉ phân phối tệp nhị phân cho các máy mục tiêu. Tôi cần một cách để chạy nhị phân bất kể máy phù thủy nó đang chạy trên, đó là anyways mục tiêu.

EDIT2: Máy Nguồn:

[email protected]:~/Haskell_Program/SmallApp/HelloUnix$ uname -a 
Linux mike-1215B 3.0.0-13-generiC#22-Ubuntu SMP Wed Nov 2 13:27:26 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux 
[email protected]:~/Haskell_Program/SmallApp/HelloUnix$ file HelloUnix 
HelloUnix: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xa44cf0e797cd629e0add59722d51d2b20e00fad8, not stripped 
[email protected]:~/Haskell_Program/SmallApp/HelloUnix$ ldd HelloUnix 
linux-vdso.so.1 => (0x00007fff8404f000) 
libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fa918584000) 
libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007fa91837c000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa918081000) 
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fa917e79000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa917c75000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa9178b5000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa917698000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fa918810000) 

từ xa máy 1:

[[email protected]] hchiao [1:59] uname -a 
SunOS rimmer 5.9 Generic_122301-48 i86pc i386 i86pc 
[[email protected]] hchiao [1:60] file HelloUnix 
HelloUnix:  ELF 64-bit LSB executable Version 1, dynamically linked, not stripped 

máy từ xa 2:

[email protected]:~/cloud-haskell$ uname -a 
Linux ip-10-240-88-224 3.2.0-36-virtual #57-Ubuntu SMP Tue Jan 8 22:21:19 UTC 2013 i686 i686 i386 GNU/Linux 
[email protected]:~/cloud-haskell$ file HelloUnix 
HelloUnix: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xa44cf0e797cd629e0add59722d51d2b20e00fad8, not stripped 

EDIT3: Tôi bây giờ biên dịch mã trong máy 2 và cố gắng chạy nhị phân trong máy 1. Tôi giả sử vì cả hai đều là i386 nên nhị phân sẽ có thể chạy trên máy khác. Tuy nhiên tôi nhận được lỗi này: (? Liên kết động có lẽ)

HelloUnix: Cannot find /lib/ld-linux.so.2 
Killed 

Tôi nghĩ rằng đây là nói với tôi rằng một thư viện (ld-linux.so.2) nhị phân phụ thuộc vào không có trong máy mục tiêu của tôi. Tôi hơi bối rối về lá cờ -static làm gì? Tôi giả định với lá cờ, TẤT CẢ phụ thuộc sẽ được đóng gói trong nhị phân. Điều gì sẽ là cách tốt nhất để làm cho mã Haskell di động?

+6

Có thể vấn đề là kiến ​​trúc không khớp của tệp và máy đích của bạn. Bạn có thể chạy 'uname -a' và' file HelloUnix' để kiểm tra nó. –

+3

Đó có lẽ là thông báo lỗi hữu ích nhất mà tôi hy vọng. Máy nguồn là gì? Máy mục tiêu là gì? Các thư viện động còn lại (sử dụng 'ldd') là gì? Chúng có sẵn trên mục tiêu không? –

+1

Máy 'i386' sẽ không chạy các tệp thi hành 'x86-64'. –

Trả lời

5

Nếu bạn đang nhắm mục tiêu cùng một kiến ​​trúc, nó sẽ hoạt động mà không có bất kỳ phiền toái nào (miễn là các tệp dữ liệu cần thiết cũng được phân phối).

Nếu bạn đang nhắm mục tiêu kiến ​​trúc khác, như trong trường hợp của bạn, bạn cần phải biên dịch chéo cho nền tảng đích; xem số GHC wiki.

Các vấn đề liên quan