Saya sedang menyelesaikan salah satu proyek C ++ saya yang paling awal (yang menurut kerangka kerja) adalah cross-platform. Saya mengembangkan proyek sepenuhnya di Windows dan Visual Studio, berpikir bahwa karena perpustakaan semua lintas-platform, maka melakukan pembangunan OSX "nanti" akan sepele. Ini ternyata tidak menjadi masalah, melainkan "kode Windows" tidak berjalan dengan baik dan memiliki beberapa kesalahan kompilasi yang harus diperbaiki.
Teknik apa yang ada sebelumnya memastikan bahwa kode tersebut kompatibel dengan semua platform? Mengembangkan semua platform secara bersamaan, sehingga menguji kode terhadap setiap platform pada saat yang sama, ketika fitur baru ditambahkan, daripada mengembangkan versi platform yang berbeda satu demi satu? (*)
Mencari saran khusus yang tidak tergantung pada alat, tetapi "proses pengembangan" yang membantu kompatibilitas lintas platform, terlepas dari alat apa yang digunakan. Seperti yang (*) di atas.
Khususnya saya sedang mengembangkan plug-in VST dengan WDL-OL ( https://github.com/olilarkin/wdl-ol ) dan beberapa perpustakaan DSP lintas-platform. Proyek WDL-OL memiliki proyek VS dan Xcode yang sudah diatur, tetapi saya kira masalahnya berasal dari perpustakaan dan kemudian perbedaan dalam kompiler.
sumber
Jawaban:
Membuat kode portabel bisa sangat menantang.
Pertama beberapa saran terkait bahasa yang jelas:
Kemudian beberapa rekomendasi desain:
Akhirnya poin-poin rumit:
TCHAR
), tetapi ini kemudian dapat menjadi tantangan dalam kombinasi dengan pustaka standar (misalnyacout
vswcout
untuk digunakan tergantung apakah menggunakanchar
atauwchar_t
)Tapi ini hanya saran. Di area ini Anda tidak bisa mendapatkan kepastian.
sumber
-Wall -Wextra -Werror
-pedantic
.Tidak ada yang dapat menjamin bahwa kode tersebut kompatibel dengan platform selain membangunnya, menjalankannya, dan mengujinya di sana. Oleh karena itu, pendekatan semua orang waras adalah membangun, menjalankan, dan menguji aplikasi mereka di setiap platform yang mereka proyeksikan perlu dibangun, dijalankan, dan diuji.
Continuous Integration (CI) dapat meringankan sedikit beban ini untuk proyek yang lebih kecil karena Anda bisa mendapatkan agen pembangun yang murah atau gratis untuk beberapa platform (kebanyakan Linux), melakukan pengembangan Anda pada Windows, dan cukup kembali ke Linux ketika ada masalah.
OSX CI cukup rumit.
sumber
Jika Anda meminta "proses pengembangan" dan platform pengembangan utama Anda adalah Windows dengan Visual Studio, maka saya akan menyarankan untuk mencoba membangun proyek Anda tanpa menyertakan "windows.h". Anda akan mendapatkan banyak kesalahan kompilasi yang akan mengarahkan Anda ke banyak tempat di mana Anda harus memperbaiki kode Anda. Misalnya, 'DWORD' tidak akan ditentukan # dan Anda harus menggantinya dengan
uint32_t
mana - mana (google forstdint.h
dan Anda akan menemukan informasi yang berguna tentang tipe integer dan definisi lintas-platform mereka). Selanjutnya, Anda harus mengganti semua panggilan ke Win32 API, seperti,Sleep()
dengan setara lintas platform mereka (sekali lagi, google adalah teman terbaik Anda, yang akan menunjukkan pertanyaan dan jawaban yang relevan di situs stack * .com). Anda mungkin tidak akan berhasil menemukan semua penggantian lintas platform yang relevan untuk kode Anda dan Anda harus mengembalikaninclude "windows."
arahan Anda tetapi meletakkannya di bawah#ifdef _WIN32
- lebih detail di siniTerus ajukan lebih banyak pertanyaan konkret dan dapatkan jawaban - ini adalah saran umum untuk "apa yang seharusnya menjadi proses pengembangan"
EDIT 1 Saran saya yang lain adalah menggunakan gcc dan / atau dentang mesin pengembangan Windows Anda (bersama dengan Visual Studio)
sumber
Itu tergantung pada "beberapa kesalahan kompilasi" yang Anda sebutkan. Tanpa mengetahui siapa mereka, tidak mungkin untuk spesifik.
Saya punya kode lintas platform untuk Windows / Linux / iOS / Android / Mac. Setiap platform baru membawa beberapa kesalahan dan peringatan tambahan saat pertama kali ditambahkan. Anda akan dengan cepat mempelajari konstruksi mana yang menimbulkan masalah. Entah menghindari mereka, atau abstrak perbedaan menjadi header dengan
#ifdef
s. Cobalah untuk tidak pernah#ifdef
antar platform dalam kode Anda sendiri.Satu contoh:
membuat instance sementara
MyClass
yang dihapus setelahmyfunction
kembali. Dengan beberapa kompiler C ++ saya, instance itu baca / tulis (dan fakta bahwa itu sementara dan akan segera dihancurkan tidak khawatir dengan kompiler). Dengan yang lain,myfunction
harus didefinisikan ulang untuk mengambilconst MyClass &
, atau kompilator mengeluh. Tidak masalah apa kata standar C ++, atau kompiler mana yang benar dan mana yang salah. Setelah menemukan kesalahan beberapa kali saya tahu (a) menyatakan variabel sementara jenisMyClass
dan meneruskannya kemyfunction
atau (b) mendeklarasikan referensiconst
dimyfunction
dan gunakanmutable
di sana-sini untuk mendekonstasikan.Intinya: menumpuk pengalaman dan mengembangkan standar pengkodean Anda sendiri.
sumber
Cara yang mungkin untuk membantu portabilitas bisa dengan hanya mengandalkan deklarasi dan fitur yang disediakan oleh standar C ++ 11 , dan dengan menggunakan pustaka dan kerangka kerja lintas platform seperti POCO & Qt .
Tetapi bahkan ini bukan bukti kegagalan. Ingatlah pepatah itu
Dengan latihan, disiplin dan banyak pengalaman, memindahkan program ke platform lain biasanya dapat dilakukan dengan cepat. Tetapi pengalaman dan pengetahuan sangat penting.
sumber