การจัดการการพึ่งพา Maven เหมือนสำหรับ C ++? [ปิด]


95

สมมติว่าฉันมีโปรเจ็กต์ C ++ ที่แยกออกเป็นโปรเจ็กต์ย่อยหลายโปรเจ็กต์ โครงการย่อยทั้งหมดสร้าง DLL และทีมนักพัฒนาที่แตกต่างกันทำงานในแต่ละโครงการย่อย ตอนนี้ถ้าฉันต้องการสร้างโครงการหลักมีวิธีหลีกเลี่ยงไม่ให้สร้างโครงการย่อยทั้งหมดด้วยตัวเองหรือไม่?

ในระยะสั้นฉันกำลังมองหาสิ่งที่จัดการการพึ่งพา (เช่นสำหรับไฟล์ไบนารีและส่วนหัว) ในลักษณะเดียวกับที่ Maven ทำกับ Java

ในความเป็นจริงฉันพยายามใช้ Maven สำหรับสิ่งนี้ แต่ค่อนข้างยุ่งยากเพราะฉันต้องสร้างแพ็คเกจด้วยตนเองและค่อนข้างบ่อย Maven พลาดที่จะรับการเปลี่ยนแปลงล่าสุด นอกจากนี้การเรียกใช้การรวบรวมนั้นเป็นเรื่องแฮ็คเล็กน้อยเนื่องจากฉันต้องเรียก NAnt จากภายใน Maven (ฉันใช้คุณสมบัติของ NAnt เพื่อสร้างโซลูชัน Visual Studio โดยตรง)

คำแนะนำและแนวคิดเกี่ยวกับวิธีการทำสิ่งนี้หรือไม่?


ปัญหาเมื่อใช้ make คือฉันต้องสร้างทุกอย่างอย่างน้อยหนึ่งครั้งดังนั้นจึงต้องการไฟล์ต้นฉบับสำหรับการอ้างอิง โดยเฉพาะอย่างยิ่งเมื่อสร้างไลบรารีที่พึ่งพาขึ้นมาใหม่อาจใช้เวลานานมากและส่งผลกระทบอย่างมากต่อผลผลิต หรือฉันขาดอะไรไป?
weberste

4
ดูเหมือนจะเป็นคำถามที่มีประโยชน์ บางทีคำถามนี้อาจถูกส่งไปยังเว็บไซต์อื่นที่ยินดีกับคำถามเหล่านี้มากกว่า ฉันกำลังมองหาแนวทางปฏิบัติที่ดีที่สุดสำหรับการจัดการการพึ่งพา c ++
simgineer

นี่เป็นเวลาประมาณ 10 ปีแล้วดังนั้นจึงมีความเป็นไปได้ 3 ประการที่นี่คุณกำลังใช้ในทางที่ผิดmavenคุณกำลังพลาดประเด็นทั้งหมดไปmavenหรือ 10 ปีที่แล้วเมื่อฉันไม่ได้ใช้mavenC ++ มันมีประโยชน์น้อยกว่าสำหรับ C ++ ฉันไม่สามารถพูดได้สำหรับปี 2009 แต่ในช่วงไม่กี่ปีที่ผ่านมาจากประสบการณ์mavenเป็นสิ่งที่คุณจะใช้สำหรับปัญหาที่คุณอธิบาย มันทำในสิ่งที่คุณต้องการและค่อนข้างมีประสิทธิภาพและดีและไม่ทำสิ่งที่เป็นลบที่คุณอ้างว่าทำ ใครก็ตามที่อ่านสิ่งนี้ในปี 2019 หรือใหม่กว่าควรพิจารณาใช้mavenเพื่อจุดประสงค์นี้อย่างยิ่ง
searchengine27

คำตอบ:


37

คำตอบเริ่มต้น : ฉันขอแนะนำให้ใช้ CMake เป็นโปรแกรมสร้างไฟล์แบบหลายแพลตฟอร์ม (สร้างโครงการ Visual Studio หรือ Eclipse CDT ด้วย)

http://www.cmake.org/

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

พวกเขายังมีโมดูลมากมายเกี่ยวกับวิธีค้นหาไลบรารีบิลด์ที่ติดตั้งไว้ล่วงหน้าซึ่งจำเป็นสำหรับโครงการ (เช่น Boost, QT เป็นต้น)


อัปเดต : ในช่วงเวลานั้นมีความพยายามที่จะแนะนำการจัดการแพ็คเกจสำหรับ C ++ บางโครงการน่าดู:

  • conan.ioทำงานร่วมกับเครื่องมือสร้างที่สำคัญ:
    • CMake
    • Visual Studio
    • Makefile
    • XCode
    • ...
  • cpmขึ้นอยู่กับ CMake ( หมายเหตุ CPM ไม่ได้รับการดูแลอย่างจริงจัง)
  • บัคคารู

หมายเหตุตามที่ระบุโดย @RAM ในความคิดเห็น cpm จะไม่ได้รับการดูแลอีกต่อไป


7
ฉันใช้ CMake เมื่อสองสามเดือนก่อนและแน่นอนว่าการตรวจสอบไลบรารีที่ติดตั้งไว้ล่วงหน้านั้นทำงานได้ดีมาก อย่างไรก็ตามการอ้างอิงไบนารีอื่น ๆ (เช่นสิ่งที่มาจากโครงการย่อยของฉัน) ไม่สามารถจัดการได้อย่างง่ายดาย ฉันพลาดอะไรไปรึเปล่า?
weberste

3
@weberste จริงๆแล้วไม่มี maven เหมือนกับเครื่องมือสำหรับ C / C ++ นักพัฒนาพยายามจัดการการจัดการการพึ่งพาด้วยเครื่องมือ apt-get like
SunnyShah

1
cpm ไม่ได้รับการบำรุงรักษาอย่างจริงจังและตายไปแล้วตั้งแต่ต้นปี 2015
RAM

@RAM: ขอบคุณที่ชี้ให้เห็น ฉันได้เพิ่มบันทึกในโพสต์โดยอ้างอิงถึงคุณ
ovanes

2
CMake เป็นระบบสร้างที่มีความสามารถ จำกัด ในการค้นหาการอ้างอิง ไม่ใช่ผู้จัดการการพึ่งพาในแง่ของ NPM, Cargo ฯลฯ
sdgfsdh

17

สำหรับการจัดการการพึ่งพามีโครงการใหม่ (เป็น บริษัท เริ่มต้น) ซึ่งใช้เครื่องมือประเภทนี้: https://github.com/biicode (ตัวจัดการการพึ่งพา C ++) คุณสามารถเพิ่มการอ้างอิงของคุณและควรใช้งานได้

ปัจจุบันชื่อของโครงการคือconan.ioพวกเขาได้มาจากJFrog

UPDATE:โปรเจ็กต์ตายแล้ว ... น่าเสียดายที่ดูเหมือนว่าการเริ่มต้นจะไม่สามารถรับลูกค้าที่จ่ายเบี้ยประกันภัยได้เพียงพอ แต่ดูเหมือนว่าเซิร์ฟเวอร์จะทำงานได้ดี

UPDATE2:ดูเหมือนว่าจะมีโครงการทดแทน: conan.io (ขอบคุณ @mucaho)


ฉันสามารถลบลิงค์ได้ .. โครงการถูกปิดตอนนี้เป็น conan.io
carlos.baez

ขอบคุณสำหรับการอัพเดท! ผมส่วนใหญ่ก็มองจากความอยากรู้ดูเหมือนว่ามันยังคงเป็นไปได้ที่จะกระตุ้นรอบบน GitHub ของพวกเขาสำหรับเอกสาร ; มันอาจจะไม่ดีเท่ากับสิ่งที่อยู่บนเว็บไซต์ ณ จุดหนึ่ง แต่ฉันคิดว่ามันดีกว่าไม่มีอะไรเลย แค่สงสัยว่า conan.io เป็นแค่การรีแบรนด์หรือเป็นผลิตภัณฑ์ที่แตกต่างกันโดยสิ้นเชิง?
jrh

1
ไม่ใช่การรีแบรนด์ แต่เป็นโครงการใหม่ทั้งหมดตั้งแต่เริ่มต้นพร้อมบทเรียนทั้งหมดที่ได้เรียนรู้: โอเพ่นซอร์สที่สมบูรณ์แบบกระจายอำนาจอย่างเต็มที่ด้วยเซิร์ฟเวอร์ภายในองค์กรรองรับระบบสร้างทั้งหมดจัดการไบนารี
drodri

8

ฉันขอแนะนำระบบการสร้างระดับสูงต่อไปนี้:


ปลั๊กอิน Maven Nar ได้รับการสนับสนุนที่ดี ฉันใช้มันและฉันชอบจนถึงตอนนี้ อย่างไรก็ตามคุณต้องเข้าใจว่า Maven ไม่ดีสำหรับการซื้อคืนแบบโมโน โซลูชัน C ++ ส่วนใหญ่ต้องการไลบรารีแชร์ Mono repo handle และอื่น ๆ
Hans

5

หากคุณต้องการเพียงการจัดการการพึ่งพาให้ลองใช้Ivyซึ่งรวมเข้ากับ Ant ได้ดี (และฉันถือว่า NAnt สามารถทำเช่นเดียวกันได้จากบล็อกนี้ซึ่งเชื่อมโยงจากไซต์ Ivy)

นอกจากนี้ยังมีByldanซึ่งเป็น Maven เวอร์ชัน. Net ไม่รู้ว่าจะเหมาะกับคุณแค่ไหน


3

Make และ GCC เป็นคำสั่งผสมที่ยอดเยี่ยมสำหรับการตรวจสอบการพึ่งพาที่ดีจริงๆ

GCC สามารถสร้างไฟล์อ้างอิง 'make' โดยอัตโนมัติ (-MD commandline switch) เพื่อให้สามารถสร้างไฟล์ต้นฉบับทั้งหมดที่ขึ้นอยู่กับส่วนหัวที่กำหนดขึ้นมาใหม่ได้เช่น

ฉันมีกฎง่ายๆที่ฉันตัดและวางลงใน makefiles ของฉัน:

# compile c files   
%.o:    %.c
    ${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@

# compile c++ files
%.opp:  %.cpp
    ${CPP} ${CPPFLAGS} -c $< -MD -MF $(<:%.cpp=%.dep) -o $@

ตอนนี้ถ้าไฟล์ออบเจ็กต์ของคุณถูกประกาศในรายการ OBJ_C และ OBJ_CPP:

.PHONY: cleandep
cleandep:
    rm -f $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

-include $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

ทำให้สามารถติดตามการอ้างอิงกับโปรเจ็กต์อื่น ๆ ได้เช่นการสร้างไลบรารีที่ใช้ร่วมกันใหม่ตามความจำเป็นเช่นกัน

ตัวอย่างเช่นหากทีมอื่นของคุณใส่ DLL ล่าสุดไว้ในโฟลเดอร์ที่แชร์บางโฟลเดอร์:

myapp: ${SRC_CPP} ${LIB_DIR}other_team.lib
  ...

${LIB_DIR}other_team.lib: /shared_folder/latest/other_team.lib
  cp /shared_folder/latest/other_team.lib ${LIB_DIR}other_team.lib

ดูความคิดเห็นของฉันที่แนบมากับคำถามเกี่ยวกับข้อกังวลของฉันเกี่ยวกับวิธีแก้ปัญหานี้
weberste

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

${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@ฉันมีช่วงเวลาที่ยากลำบากในการแยกวิเคราะห์สัญลักษณ์ Make เหล่านี้ทั้งหมดดูเหมือนว่าสิ่งนี้จะแก้ไขได้บางอย่างเช่นg++ -c main.cc -MD -MF testถ้าคุณต้องการเรียกใช้แบบสแตนด์อโลนที่บรรทัดคำสั่งและทำให้ผลลัพธ์เป็นไฟล์ชื่อ 'test'
jrh


2

ฉันแนะนำโคนันที่ฉันใช้อยู่ทุกวันนี้ มีประสิทธิภาพมากในการดูแลไลบรารีและไบนารีทั้งหมดในโครงการของคุณ


1

คุณสามารถสร้างแพ็คเกจ NuGet สำหรับไลบรารีที่ใช้และใช้ NuGet สำหรับการจัดการการพึ่งพา

ดูเพิ่มเติมNuGet สำหรับ C ++


1
NuGet เป็นส่วนขยาย Visual Studio
Toughy

@ แม้ว่ามันยังสามารถใช้เป็นการจัดการการพึ่งพาแบบสแตนด์อโลน (ไฟล์ปฏิบัติการ 4M)
Yousha Aleayoub

0

มีเครื่องมือมากมายที่วางอยู่บน SCons ซึ่งให้ฟังก์ชันการทำงานระดับสูงขึ้นคล้ายกับ Autotools ซึ่งพยายามทำให้ชีวิตของนักพัฒนาง่ายขึ้น (เช่น WAF, SNOCS) น่าเสียดายที่ SCons เองก็มีข้อเสียเปรียบที่สำคัญนั่นคือเวลารวบรวมโครงการขนาดใหญ่ที่นานขึ้น

ฉันขอแนะนำให้ลองใช้SNOCS (ซึ่งเป็น SCons ย้อนกลับ) สำหรับผู้ที่มองหาการจัดการการพึ่งพาที่ง่ายและเลือกตัวเลือกการคอมไพล์ในคำสั่งเดียว (คอมไพเลอร์, x86 / x64, Debug / Release, ไลบรารีแบบคงที่ / แชร์, ทดสอบ / ติดตั้งเป้าหมาย ฯลฯ )

SNOCS ยังพยายามแก้ไขปัญหาเวลาในการคอมไพล์ที่ยาวนานโดยการจัดเก็บเอาต์พุตการกำหนดค่าโปรเจ็กต์ไว้ในไฟล์แยกต่างหากซึ่งจะช่วยให้การสร้างผลที่ตามมาสามารถข้ามเฟสการกำหนดค่าไปพร้อมกันและตรงไปยังเฟสการสร้าง (ฟีเจอร์สุดท้ายอยู่ระหว่างการก่อสร้างในขณะนี้)

การกำหนดค่าของ CMake กลายเป็นเรื่องที่น่าเบื่อในโซลูชันขนาดใหญ่ดังนั้นการบำรุงรักษาระบบบิวด์จึงใช้เวลาส่วนใหญ่ในการพัฒนา โชคดีอย่างที่ Martijn ได้กล่าวไปแล้วว่ามีรหัสทางชีวภาพที่ "ใช้ CMake เพื่อสร้างโครงการของคุณด้วยการอ้างอิง"


-1

ลองSCons

SCons เป็นเครื่องมือสร้างซอฟต์แวร์โอเพ่นซอร์สนั่นคือเครื่องมือสร้างรุ่นต่อไป คิดว่า SCons เป็นสิ่งทดแทนข้ามแพลตฟอร์มที่ได้รับการปรับปรุงสำหรับยูทิลิตี้ Make แบบคลาสสิกที่มีฟังก์ชันการทำงานแบบบูรณาการคล้ายกับ autoconf / automake และแคชคอมไพเลอร์เช่น ccache กล่าวโดยย่อ SCons เป็นวิธีที่ง่ายกว่าเชื่อถือได้และรวดเร็วกว่าในการสร้างซอฟต์แวร์


3
SCons ไม่มีการจัดการการพึ่งพาหรือที่เก็บในตัวอย่างที่ถาม
Maxime Viargues

-4

ฉันแนะนำให้ใช้แม่ของระบบการพึ่งพาการสร้างทั้งหมด: make


ฉันใช้สิ่งนี้อย่างกว้างขวาง GCC สามารถสร้างไฟล์อ้างอิงที่ 'make' สามารถกินได้ เพียงพอสำหรับคำตอบอื่นบางที ...
จะ

8
make เป็นสิ่งที่ทุกคนต้องการหลีกเลี่ยง / แทนที่โดยดูที่ build
-automation-

-6

ลอง scons คุณจะติดใจ ทำให้ล้าสมัยยากและมีราคาแพงในการดูแลรักษา


ฉันดูที่ Scons แต่ไม่พบวิธีจัดการการอ้างอิงไบนารี คุณมีตัวอย่างสำหรับสิ่งนี้หรือไม่?
weberste

1
เนื่องจาก scons เป็น python คุณสามารถเขียนโค้ดอะไรก็ได้ที่คุณต้องการจัดการการอ้างอิงไบนารีของคุณได้อย่างง่ายดาย บางทีการมี "SConscript" ในไดเร็กทอรีของการอ้างอิงไบนารีของคุณก็ช่วยได้เช่นกัน ฉันไม่แน่ใจว่าความต้องการของคุณคืออะไรที่ยาก เปโดร.
piotr

16
ดังนั้นคุณกำลังแนะนำเครื่องมือตาม "ฉันไม่แน่ใจว่าคุณต้องการอะไร แต่คุณสามารถตั้งโปรแกรมด้วยตัวเองใน Python" ทำไมคุณถึงต้องการ scons?
jalf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.