Visual c ++: # รวมไฟล์จากโปรเจ็กต์อื่น ๆ ในโซลูชันเดียวกัน


113

ฉันกำลังทำงานกับเกมโดยใช้ Visual C ++ ฉันมีส่วนประกอบบางอย่างในโปรเจ็กต์แยกต่างหากและตั้งค่าการอ้างอิงโปรเจ็กต์ ฉันจะ # รวมไฟล์ส่วนหัวจากโปรเจ็กต์อื่นได้อย่างไร ฉันไม่รู้ว่าจะใช้คลาสจากโครงการหนึ่งไปยังอีกโครงการหนึ่งได้อย่างไร

คำตอบ:


200

การตั้งค่าสำหรับคอมไพเลอร์

ในโปรเจ็กต์ที่คุณต้องการ # รวมไฟล์ส่วนหัวจากโปรเจ็กต์อื่นคุณจะต้องเพิ่มพา ธ ของไฟล์ส่วนหัวลงในส่วนไดเร็กทอรีรวมเพิ่มเติมในคอนฟิกูเรชันโปรเจ็กต์

ในการเข้าถึงการกำหนดค่าโครงการ:

  1. คลิกขวาที่โปรเจ็กต์แล้วเลือกคุณสมบัติ
  2. เลือกคุณสมบัติการกำหนดค่า -> C / C ++ -> ทั่วไป
  3. กำหนดเส้นทางภายใต้ไดเร็กทอรีรวมเพิ่มเติม

วิธีการรวม

หากต้องการรวมไฟล์ส่วนหัวเพียงแค่เขียนสิ่งต่อไปนี้ในโค้ดของคุณ:

#include "filename.h"

โปรดทราบว่าคุณไม่จำเป็นต้องระบุเส้นทางที่นี่เนื่องจากคุณรวมไดเร็กทอรีไว้ในไดเร็กทอรีรวมเพิ่มเติมแล้วดังนั้น Visual Studio จะทราบว่าจะค้นหาได้จากที่ใด

หากคุณไม่ต้องการเพิ่มตำแหน่งไฟล์ส่วนหัวทั้งหมดในการตั้งค่าโปรเจ็กต์คุณสามารถรวมไดเร็กทอรีได้ไม่เกินจุดแล้ว #include เทียบกับจุดนั้น:

// In project settings
Additional Include Directories    ..\..\libroot

// In code
#include "lib1/lib1.h"    // path is relative to libroot
#include "lib2/lib2.h"    // path is relative to libroot

การตั้งค่าสำหรับ linker

หากใช้ไลบรารีแบบคงที่ (เช่นไฟล์. lib) คุณจะต้องเพิ่มไลบรารีลงในอินพุตตัวเชื่อมโยงเพื่อให้ในเวลาเชื่อมโยงสัญลักษณ์สามารถเชื่อมโยงกับ (มิฉะนั้นคุณจะได้รับสัญลักษณ์ที่ไม่ได้รับการแก้ไข):

  1. คลิกขวาที่โปรเจ็กต์แล้วเลือกคุณสมบัติ
  2. เลือก Configuration Properties-> Linker-> Input
  3. เข้าสู่ไลบรารีภายใต้การพึ่งพาเพิ่มเติม

6
ฉันขอบอกว่าหลังจากเมื่อเช้าของการอ่านคำตอบเกี่ยวกับเรื่องนี้ใน SO คุณเป็นคนที่ชัดเจนและครอบคลุมที่สุดที่ฉันเจอ ทำได้ดีมากและขอบคุณ!
David Hall

9
มีคำแนะนำจากผู้ใช้ที่ไม่ระบุชื่อว่า "เมื่อคุณรวมเส้นทางสำหรับไลบรารีตรวจสอบให้แน่ใจว่าคุณได้ป้อนเครื่องหมายคำพูดหากเส้นทางมีช่องว่าง" เพิ่มไว้เป็นข้อคิดเห็นถ้าจะช่วยใคร
iDev

2
วิธีเพิ่มเติมอีกวิธีหนึ่งในการรวมไลบรารีแบบคงที่คือภายใน "การอ้างอิงโครงการ" ของโซลูชันเพื่อกำหนดค่าโครงการให้เป็นการอ้างอิงของไลบรารีแบบคงที่ที่จะเชื่อมโยงฉันใช้เวลานานพอสมควรในการคิดว่าเหตุใดโครงการหนึ่งของฉันจึงเชื่อมโยงอย่างถูกต้อง และอีกอย่างไม่ใช่ - นี่คือเหตุผล
Stuart Wood

3
ฉันต้องการชี้ให้เห็นว่าการใช้ "ไดเรกทอรีรวมเพิ่มเติม" กับไดเรกทอรีไฟล์ต้นฉบับของโครงการอื่นอาจเป็นความคิดที่แย่มาก โปรเจ็กต์อื่นอาจมีไฟล์ที่มีชื่อเดียวกัน (มีโอกาสมากหากคุณใช้ส่วนหัวที่คอมไพล์ไว้ล่วงหน้าสำหรับแต่ละไฟล์) #include "proj2\include.h"ส่วนตัวผมชอบที่จะเพิ่มโฟลเดอร์แม่ของไฟล์โครงการมาเพื่อให้คุณอย่างน้อยสามารถระบุตัวเองเช่น การมีหลายโปรเจ็กต์ต่อโซลูชันดูเหมือนจะมุ่งไปที่ภาษา NET เนื่องจากมีการใช้งานที่แตกต่างกันมาก ยังพบวิธีที่ยอดเยี่ยมในการเอาชนะสิ่งนี้สำหรับโครงการ C ++
Deji

18
นี่มันกระจอกไปหน่อย VS สามารถทำได้มากโดยอัตโนมัติ ยากที่จะเชื่อว่าไม่มีวิธีแก้ปัญหาที่ดีกว่าเมื่อเทียบกับการเข้ารหัสเส้นทางอย่างหนักการตั้งค่าการพึ่งพาโครงการหรือสิ่งที่คล้ายกันอาจจะดี
คุกกี้

4

#includeไม่มีส่วนเกี่ยวข้องกับโปรเจ็กต์ - เพียงแค่บอกพรีโปรเซสเซอร์ว่า "ใส่เนื้อหาของไฟล์ส่วนหัวที่นี่" หากคุณกำหนดเส้นทางที่ชี้ไปยังตำแหน่งที่ถูกต้อง (อาจเป็นเส้นทางสัมพัทธ์เช่น ../your_file.h) เส้นทางนั้นจะรวมได้อย่างถูกต้อง

อย่างไรก็ตามคุณจะต้องเรียนรู้เกี่ยวกับไลบรารี (ไลบรารีแบบคงที่ / ไดนามิก) เพื่อที่จะทำให้โครงการดังกล่าวเชื่อมโยงได้อย่างถูกต้อง - แต่นั่นเป็นอีกคำถามหนึ่ง


3

เนื่องจากทั้งสองโครงการอยู่ภายใต้โซลูชันเดียวกันจึงมีวิธีที่ง่ายกว่าสำหรับการรวมไฟล์และตัวเชื่อมโยงตามที่อธิบายไว้ในhttps://docs.microsoft.com/en-us/cpp/build/adding-references-in-visual-cpp- โครงการ? view = vs-2019 :

  1. รวมสามารถเขียนในเส้นทางสัมพัทธ์ (เช่น#include "../libProject/libHeader.h")
  2. สำหรับผู้เชื่อมโยงคลิกขวาที่ "การอ้างอิง" คลิกที่เพิ่มการอ้างอิงและเลือกโครงการอื่น

ดีและเรียบง่าย แต่แย่เกินไปที่จำเป็นต้องใช้เส้นทางสัมพัทธ์ทุกที่ที่คุณใส่ส่วนหัว
โยโย่

2

คุณต้องกำหนดเส้นทางไปยังส่วนหัวในคุณสมบัติของโปรเจ็กต์เพื่อให้คอมไพเลอร์ดูที่นั่นเมื่อพยายามค้นหาไฟล์ส่วนหัว ฉันจำตำแหน่งที่แน่นอนไม่ได้ แต่ดูคุณสมบัติของโครงการแล้วคุณจะเห็น


ตำแหน่งสามารถอยู่ภายใต้คุณสมบัติ> C / C ++> ทั่วไป> ไดเร็กทอรีรวมเพิ่มเติม
Mustafa Kemal

0

พยายามหลีกเลี่ยงการอ้างอิงเส้นทางแบบสมบูรณ์ในคำสั่ง #include ไม่ว่าจะเป็นแบบสัมบูรณ์หรือแบบสัมพัทธ์ ให้เพิ่มตำแหน่งของโฟลเดอร์รวมของโปรเจ็กต์อื่นในการตั้งค่าโปรเจ็กต์ของคุณแทน ใช้เฉพาะโฟลเดอร์ย่อยในการอ้างอิงเส้นทางเมื่อจำเป็น ด้วยวิธีนี้จะง่ายกว่าในการเคลื่อนย้ายสิ่งต่างๆโดยไม่ต้องอัปเดตโค้ดของคุณ


0

ขยายคำตอบของ @ Benav แนวทางที่ฉันชอบคือ:

  1. เพิ่มไดเร็กทอรีโซลูชันในพา ธ รวมของคุณ:
    • คลิกขวาที่โครงการของคุณใน Solution Explorer
    • เลือกคุณสมบัติ
    • เลือกการกำหนดค่าทั้งหมดและแพลตฟอร์มทั้งหมดจากเมนูแบบเลื่อนลง
    • เลือก C / C ++> ทั่วไป
    • เพิ่ม$(SolutionDir)ในไดเรกทอรีรวมเพิ่มเติม
  2. เพิ่มการอ้างอิงไปยังแต่ละโครงการที่คุณต้องการใช้:
    • คลิกขวาที่การอ้างอิงโครงการของคุณใน Solution Explorer
    • เลือกเพิ่มการอ้างอิง ...
    • เลือกโครงการที่คุณต้องการอ้างถึง

ตอนนี้คุณสามารถรวมส่วนหัวจากโครงการอ้างอิงของคุณได้ดังนี้:

#include "OtherProject/Header.h"

หมายเหตุ:

  • สิ่งนี้จะถือว่าไฟล์โซลูชันของคุณถูกเก็บไว้หนึ่งโฟลเดอร์จากแต่ละโครงการของคุณซึ่งเป็นองค์กรเริ่มต้นเมื่อสร้างโครงการด้วย Visual Studio
  • ตอนนี้คุณอาจรวมถึงการใด ๆไฟล์จากเส้นทางที่สัมพันธ์กับโฟลเดอร์การแก้ปัญหาซึ่งอาจจะไม่เป็นที่น่าพอใจ แต่สำหรับความเรียบง่ายของวิธีการที่ฉันตกลงกับเรื่องนี้
  • ขั้นตอนที่ 2 ไม่จำเป็นสำหรับ#includes แต่เป็นการตั้งค่าการอ้างอิงการสร้างที่ถูกต้องซึ่งคุณอาจต้องการ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.