2008-08-30 43 views

Trả lời

9

Tôi đã duy trì một số năm thư viện mạng ANSI C được chuyển đến gần 30 hệ điều hành và trình biên dịch khác nhau. Thư viện không có bất kỳ thành phần GUI nào, làm cho nó dễ dàng hơn. Chúng tôi đã kết thúc việc trừu tượng hóa các tệp nguồn chuyên dụng bất kỳ thường trình nào không nhất quán trên các nền tảng và sử dụng #defines khi thích hợp trong các tệp nguồn đó. Điều này giữ mã đã được điều chỉnh cho mỗi nền tảng bị cô lập ra khỏi logic kinh doanh chính của thư viện. Chúng tôi cũng đã sử dụng rộng rãi các typedef và các loại riêng của chúng tôi để chúng tôi có thể dễ dàng thay đổi chúng trên mỗi nền tảng nếu cần. Điều này làm cho cổng đến các nền tảng 64 bit khá dễ dàng.

Nếu bạn đang tìm kiếm các thành phần GUI, tôi khuyên bạn nên xem bộ công cụ GUI như WxWindows hoặc Qt (cả hai thư viện C++).

0

Cố gắng viết nhiều nhất có thể với POSIX. Mac và Linux hỗ trợ POSIX một cách tự nhiên và Windows có một hệ thống có thể chạy nó (theo như tôi biết - tôi chưa bao giờ thực sự sử dụng nó). Nếu ứng dụng của bạn là đồ họa, cả Mac và Linux đều hỗ trợ các thư viện X11 (Linux nguyên bản, Mac thông qua X11.app) và có rất nhiều cách để chạy các ứng dụng X11 chạy trên Windows.

Tuy nhiên, nếu bạn đang tìm kiếm triển khai đa nền tảng thực sự, bạn có thể chuyển sang ngôn ngữ như Java hoặc Python có khả năng chạy cùng một chương trình trên nhiều hệ thống với ít hoặc không có thay đổi.

Chỉnh sửa: Tôi vừa tải xuống ứng dụng và xem các tệp. Dường như có các tệp nhị phân cho tất cả 3 nền tảng trong một thư mục. Nếu bạn quan tâm đến cách viết ứng dụng có thể được chuyển từ máy này sang máy khác mà không làm mất cài đặt, bạn có thể viết tất cả cấu hình của mình vào một tệp trong cùng thư mục với tệp thực thi và không chạm vào đăng ký Windows hoặc tạo bất kỳ thư mục dấu chấm nào trong thư mục chính của người dùng đang chạy chương trình trên Linux hoặc Mac. Và theo như việc tạo ra một phân phối nhị phân Linux chéo, POSIX/X11 32 bit có lẽ sẽ là đặt cược an toàn nhất. Tôi không chắc chắn về những gì JungleDisk sử dụng như tôi hiện đang sử dụng trên máy Mac.

4

Hơn nữa để câu trả lời của Kyle, tôi thực sự khuyên bạn nên chống lại cố gắng sử dụng hệ thống con Posix trong Windows. Nó được triển khai ở mức tối thiểu tuyệt đối như vậy mà Microsoft có thể yêu cầu "hỗ trợ Posix" trên hộp đánh dấu trang tính năng. Có lẽ ai đó ở đó thực sự sử dụng nó, nhưng tôi chưa bao giờ gặp nó trong đời thực.

Người ta chắc chắn có thể viết mã C đa nền tảng, bạn chỉ cần phải nhận thức được sự khác biệt giữa các nền tảng và thử nghiệm, kiểm tra, thử nghiệm. Các bài kiểm tra đơn vị và giải pháp CI (tích hợp liên tục) sẽ đi một chặng đường dài để đảm bảo chương trình của bạn hoạt động trên tất cả các nền tảng mục tiêu của bạn.

Cách tiếp cận tốt là tách riêng các công cụ phụ thuộc vào hệ thống trong một hoặc một vài mô-đun. Cung cấp giao diện độc lập với hệ thống từ mô-đun đó. Sau đó, xây dựng mọi thứ khác trên đầu trang của mô-đun đó, do đó, nó không phụ thuộc vào hệ thống bạn đang biên dịch.

7

Cố gắng tránh #ifdefs phụ thuộc vào nền tảng vì chúng có xu hướng tăng theo cấp số nhân khi bạn thêm nền tảng mới. Thay vào đó, hãy cố gắng sắp xếp các tệp nguồn của bạn dưới dạng một cây có mã độc lập với nền tảng ở gốc và mã phụ thuộc vào nền tảng trên "lá". Có một cuốn sách hay về chủ đề này, Multi-Platform Code Management. Mã mẫu trong nó có thể trông lỗi thời, nhưng những ý tưởng được mô tả trong cuốn sách vẫn còn rất quan trọng.

0

Có làm tồn tại khá ít thư viện di động chỉ là ví dụ tôi đã làm việc trong gtk

1) lém lỉnh và quá khứ +

2) libcurl

3) libapr

Những trang trải gần mọi nền tảng và do đó chúng là công cụ hữu ích cực kỳ.

Posix là tốt trên Unices nhưng tôi cũng nghi ngờ đó là tuyệt vời trên cửa sổ, bên cạnh đó chúng tôi không có bất kỳ thứ gì cho GUI di động ở đó.

0

XVT có nền tảng GUI GUI C trên nền tảng chéo 15 năm trở lên và nằm trên đầu trang của các cửa sổ gốc toollkits. See WWW.XVT.COM.

Chúng hỗ trợ ít nhất LINUX, Windows và MAC.

0

Tôi cũng thứ hai là đề xuất tách mã cho các nền tảng khác nhau thành các mô-đun/cây khác nhau thay vì ifdef.

Ngoài ra tôi khuyên bạn nên kiểm tra trước những khác biệt trong nền tảng của bạn là gì và cách bạn có thể tóm tắt chúng. Ví dụ. đây là một số công cụ liên quan đến hệ điều hành (ví dụ: CR gây khó chịu, CRLF, LF trong tệp văn bản) hoặc nội dung phần cứng. Ví dụ. đề cập posix compability trước doesnt dừng bạn từ

int c; 
fread(&c, sizeof(int), 1, file); 

Nhưng trên nền tảng phần cứng khác nhau bố trí bộ nhớ trong có thể hoàn toàn khác nhau (endianess), buộc bạn phải sử dụng chức năng chuyển đổi trên một số nền tảng mục tiêu.

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