ฉันกำลังสร้างเอ็นจิ้นเกมที่เรียบง่ายและมีเกมอยู่ในนั้น แนวคิดคือการมีฟังก์ชันการทำงานและลำดับชั้นคลาสพื้นฐานส่วนใหญ่ที่นำมาใช้ในเอ็นจิ้นซึ่งควรเป็น exe จากนั้นจึงมี dll ซึ่งจะใช้เกมเฉพาะตามเครื่องมือที่เอ็นจิ้นมีให้ คล้ายกับกลไกรหัสเช่น idTech4
จากนั้นเอ็นจิ้นจะโหลด dll รับอินสแตนซ์ของเกม ชี้เกมไปยังฟังก์ชันและโครงสร้างข้อมูลใดก็ตามที่เกมต้องการ และวิธีการเรียก เช่น game->update();
บนอินสแตนซ์เกม จนถึงตอนนี้ดีมาก
ฉันต้องการให้สิ่งต่าง ๆ เช่นคลาสพื้นฐานเช่น Entity, Transform, Vector3 ฯลฯ นำไปใช้ในเครื่องยนต์ ในเกมสิ่งที่ฉันต้องการคือได้รับตัวละครของฉันจาก Entity
class Character : public engine::Entity {...};
สิ่งต่าง ๆ เช่นนี้คอมไพล์ได้เลยเนื่องจากฉันรวมส่วนหัวจากเอ็นจิ้นไว้ แต่ไม่ได้เชื่อมโยงเนื่องจากฉันไม่ได้ใช้ไฟล์ obj หรือไฟล์ cpp จากเอ็นจิ้น ฉันรู้ว่าทำไมสิ่งนี้ถึงไม่ทำงาน เท่าที่ฉันรู้ตัวเลือก (สมเหตุสมผล) ของฉันคือ:
- ทำให้คลาสเหล่านี้เป็นส่วนหัวเท่านั้น - ด้วยวิธีนี้มันจะคอมไพล์ทุกที่เสมอ
ฉันไม่ต้องการสิ่งนี้เพราะมันจะเพิ่มเวลาในการคอมไพล์ ขนาดไบนารี่ ฯลฯ
- ใส่ฟังก์ชันการทำงานทั่วไปลงใน lib หรือ dll
สิ่งนี้จะได้ผล แต่ไฟล์ lib หมายความว่าฉันมีคลาสเดียวกันที่คอมไพล์ (เชื่อมโยง) ทั้งใน exe (เอ็นจิ้น) และ dll (เกม) - มันดูเลอะเทอะ Dll ใช้งานได้ แต่ดูเหมือนว่าจะทำงานหนักมากกับการส่งออกและการนำเข้าทั้งหมดที่ฉันต้องทำกับทั้งเอ็นจิ้นและเกม สิ่งที่สำคัญที่สุดคือ ทั้งแนวทาง lib และ dll ต่างก็มีปัญหาร่วมกัน นั่นคือในระหว่างการพัฒนา ฉันอาจจะต้องย้ายคลาสต่างๆ ไปมาบ่อยครั้ง เนื่องจากลำดับชั้นของคลาสอาจเปลี่ยนแปลงไปมาก เป็นต้น
คำถามของฉันคือ มีวิธีอื่นในการแก้ไขปัญหานี้หรือไม่ สำหรับฉันนี่ดูเหมือนเป็นคุณสมบัติที่มีประโยชน์มากที่จะมีลำดับชั้นของคลาสใน exe ที่ใช้งานได้จาก dll ฉันลองทำสิ่งที่ไร้สาระมาก เช่น ให้ลิงเกอร์ใช้ไฟล์ .obj ที่สร้างขึ้นระหว่างการคอมไพล์เอ็นจิ้น แต่มันก็ไม่ได้ผลเว้นแต่ฉันจะระบุไฟล์ .obj ทั้งหมดทีละไฟล์ (ฉันใช้ Visual Studio 2017)
ฉันไม่ต้องการละทิ้งความเป็นโมดูลาร์ของการออกแบบนี้
แก้ไข: เนื่องจาก dll เป็นแพลตฟอร์มเฉพาะ เราลองพิจารณา Windows กัน (แม้ว่าฉันเดาว่าแพลตฟอร์มอื่นจะคล้ายกัน)