C ++에 대한 Maven과 같은 종속성 관리? [닫은]


94

여러 하위 프로젝트로 분할 된 C ++ 프로젝트가 있다고 가정 해 보겠습니다. 하위 프로젝트는 모두 DLL을 생성하고 서로 다른 개발자 팀이 각 하위 프로젝트에서 작업합니다. 이제 메인 프로젝트를 빌드하려는 경우 모든 하위 프로젝트를 혼자서 빌드하지 않아도되는 방법이 있습니까?

요컨대, Maven이 Java에서하는 것과 유사한 방식으로 종속성 관리 (즉, 바이너리 파일 및 헤더)를 수행하는 것을 찾고 있습니다.

사실, 나는 이것을 위해 Maven을 사용하려고했지만 이것은 패키지를 수동으로 꽤 자주 만들어야하기 때문에 다소 번거 롭습니다. Maven은 가장 최근의 변경 사항을 선택하는 것을 놓칩니다. 또한 Maven 내에서 NAnt를 호출해야하므로 컴파일을 실행하는 것은 약간의 해킹입니다 (NAnt의 기능을 사용하여 Visual Studio 솔루션을 직접 빌드합니다).

이를 수행하는 방법에 대한 힌트와 아이디어가 있습니까?


make를 사용할 때의 문제는 적어도 한 번은 모든 것을 빌드해야하므로 종속성에 대한 소스 파일도 필요하다는 것입니다. 특히 종속 라이브러리를 재 구축 할 때 시간이 많이 걸리고 생산성에 심각한 영향을 미칠 수 있습니다. 아니면 내가 뭔가를 놓치고 있습니까?
weberste

3
유용한 질문 인 것 같습니다. 이 질문을 더 환영하는 다른 사이트로 이식 할 수 있습니까? C ++ 종속성 관리에 대한 모범 사례를 찾고 있습니다.
simgineer

이것은 약 10 년 늦었으므로 여기에 세 가지 가능성이 있습니다. 오용 하고 있거나,에 maven대한 전체 요점을 놓치고 maven있거나 10 년 전 mavenC ++에 사용하지 않았을 때는 C ++에 훨씬 유용 하지 않았습니다 . 2009 년에 대해 말할 수는 없지만, 최근 몇 년 동안 경험 maven을 통해 설명하는 문제에 대해 정확히 사용할 것입니다. 그것은 당신이 원하는 것을 정확히, 매우 효율적이고 잘 수행하며, 당신이 주장하는 부정적인 일을하지 않습니다. 2019 년 이후에이 글을 읽는 사람 maven은이 목적 을 위해 사용하는 것을 강력히 고려해야 합니다.
searchengine27

답변:


37

초기 답변 : CMake를 사용하는 것이 좋습니다. 다중 플랫폼 make 파일 생성기입니다 (Visual Studio 또는 Eclipse CDT 프로젝트도 생성).

http://www.cmake.org/

정말 좋은 경험을했습니다. 내가 좋아하는 가장 좋은 점은 일반적인 프로젝트 구조를 생성하는 능력이었습니다. 따라서 매번 스크립트를 변경하지 않고 일반적으로 단위 테스트 등에 대한 하위 프로젝트 조회를 포함 할 수 있습니다.

또한 프로젝트에 필요한 사전 설치된 빌드 라이브러리를 찾는 방법에 대한 많은 모듈 (예 : Boost, QT 등)이 있습니다.


업데이트 : 그동안 C ++ 용 패키지 관리를 도입하려는 노력이있었습니다. 살펴볼 가치가있는 몇 가지 프로젝트 :

  • conan.io 는 주요 빌드 도구와 통합됩니다.
    • CMake
    • 비주얼 스튜디오
    • Makefile
    • XCode
    • ...
  • CPM CMake에 기초하여 ( 참고 CPM 적극적으로 유지되는 것은 아니다.)
  • Buckaroo

주석 에서 @RAM이 지적했듯이 cpm은 더 이상 적극적으로 유지되지 않습니다.


7
나는 몇 달 전에 CMake를 사용했고 실제로 사전 설치된 라이브러리를 확인하는 것은 매우 훌륭하게 작동했습니다. 그러나 다른 바이너리 의존성 (즉, 내 하위 프로젝트에서 오는 것)은 쉽게 관리 할 수 ​​없습니다. 내가 뭔가를 놓치고 있습니까?
weberste

3
@weberste, 실제로 C / C ++ 용 도구와 같은 도구는 없습니다. 개발자는 apt-get like 도구를 사용하여 종속성 관리를 처리하려고합니다.
SunnyShah

1
cpm은 적극적으로 유지되지 않으며 2015 년 초 이후로 사망했습니다.
RAM

@RAM : 지적 해 주셔서 감사합니다. 나는 당신을 참조하여 게시물에 메모를 추가했습니다.
ovanes

2
CMake는 종속성을 찾는 기능이 제한된 빌드 시스템입니다. 그것은 등 NPM,화물의 의미에서 종속성 관리자 아니다
sdgfsdh

17

종속성 관리를 위해 https://github.com/biicode(C++ 종속성 관리자) 와 같은 유형의 도구를 구현하는 새로운 프로젝트 (스타트 업 회사)가 있습니다. 종속성을 추가 할 수 있으며 작동합니다.

현재 프로젝트의 이름입니다 conan.io , 그들에 의해 인수되었다 JFrog .

업데이트 : 프로젝트가 죽었습니다 ... 불행히도 스타트 업이 프리미엄 지불 고객을 충분히 확보하지 못한 것 같지만 서버는 정상적으로 작동하는 것 같습니다 ...

UPDATE2 : 대체 프로젝트가있는 것 같습니다 : conan.io (@mucaho에게 감사드립니다)


링크를 제거 할 수 있습니다. 프로젝트가 닫혔습니다. 이제 conan.io
carlos.baez

업데이트 해주셔서 감사합니다! 나는 대부분 호기심에서 찾고 있습니다 . 문서 를 위해 github를 둘러 보는 것이 여전히 가능한 것 같습니다 . 웹 사이트에있는 것만 큼 좋지는 않지만 아무것도없는 것보다 낫다고 생각합니다. conan.io는 리 브랜딩입니까, 아니면 완전히 다른 제품입니까?
jrh

1
리 브랜딩이 아니라 배운 모든 교훈을 담은 완전히 새로운 프로젝트입니다. 완전히 오픈 소스, 사내 서버로 완전히 분산, 모든 빌드 시스템 지원, 바이너리 관리.
drodri

8

다음과 같은 고급 빌드 시스템을 권장합니다.


Maven Nar 플러그인이 좋은 지원을 받고 있습니다. 나는 그것을 사용하고 지금까지 좋아합니다. 그러나 Maven이 모노 저장소에 적합하지 않다는 것을 이해해야합니다. 대부분의 C ++ 솔루션에는 Mono repo 핸들 공유 라이브러리 등이 필요합니다.
Hans

5

의존성 관리 만 원한다면 Ivy를 사용 해보세요. Ant와 잘 통합됩니다 (그리고 NAnt가 Ivy 사이트에서 링크 된 이 블로그를 기반으로 동일한 작업을 수행 할 수 있다고 가정 합니다).

Maven의 .Net 버전 인 Byldan 도 있습니다 . 그래도 얼마나 잘 작동할지 모르겠습니다.


3

Make와 GCC는 정말 좋은 종속성 검사를위한 훌륭한 콤보입니다.

GCC는 예를 들어 주어진 헤더에 의존하는 모든 소스 파일을 다시 빌드 할 수 있도록 'make'종속성 파일을 자동으로 생성 할 수 있습니다 (-MD 명령 줄 스위치).

메이크 파일에 잘라서 붙여 넣는 몇 가지 간단한 규칙이 있습니다.

# 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)

물론 Make는 다른 프로젝트와의 종속성을 추적 할 수 있습니다. 예를 들어 필요에 따라 공유 라이브러리를 다시 빌드 할 수도 있습니다.

예를 들어 다른 팀이 항상 일부 공유 폴더에 최신 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을

대상이 다른 파일에 종속되어있는 경우 (예 : 실행 파일이 공유 라이브러리에 종속되어있는 경우) 소스 없이도 라이브러리 사본이 최신 상태인지 확인하는 규칙을 가질 수 있습니다. 특정 위치에서 또는 일부 버전 제어 업데이트 등을 실행하여 최신 사본.

${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@이 모든 Make 기호를 구문 분석하는 데 어려움을 겪었습니다. g++ -c main.cc -MD -MF test명령 줄에서 독립 실행 형으로 실행하려는 경우 와 같은 것으로 확인되고 결과를 'test'라는 파일에 넣습니다.
jrh


2

요즘 사용 하던 코난을 추천 합니다. 프로젝트의 모든 종속 라이브러리와 바이너리를 유지하는 것은 매우 강력합니다.


1

사용 된 라이브러리에 대한 NuGet 패키지를 만들고 종속성 관리에 NuGet을 사용할 수 있습니다.

C ++ 용 NuGet 도 참조하세요.


1
NuGet은 Visual Studio 확장입니다
Toughy 2014 년

@Toughy, 독립형 종속성 관리로 사용할 수도 있습니다. (4M 실행 파일)
Yousha Aleayoub

0

SCons 위에는 개발자의 삶을 더 쉽게 만들어주는 Autotools와 유사한 더 높은 수준의 기능을 제공하는 많은 도구가 있습니다 (예 : WAF, SNOCS). 안타깝게도 SCons 자체에는 큰 단점이 있습니다. 대규모 프로젝트의 경우 컴파일 시간이 길어집니다.

쉬운 종속성 관리를 찾고 단일 명령 (컴파일러, x86 / x64, 디버그 / 릴리스, 정적 / 공유 라이브러리, test /)에서 컴파일 옵션을 선택하는 사람들을 위해 SNOCS (SCons 반전) 를 사용해 보는 것이 좋습니다. 설치 대상 등).

SNOCS는 또한 프로젝트 구성 출력을 별도의 파일에 저장하여 긴 컴파일 시간 문제를 해결하려고합니다. 이렇게하면 결과 빌드가 구성 단계를 완전히 건너 뛰고 바로 빌드 단계로 이동할 수 있습니다 (마지막 기능은 현재 구성 중입니다).

CMake의 구성은 더 큰 솔루션에서 지루해 지므로 빌드 시스템 유지 관리에 개발자 시간이 많이 걸립니다. 운 좋게도 Martijn이 이미 언급했듯이 "CMake를 사용하여 종속성이있는 프로젝트를 생성"하는 biicode 가 있습니다.


-1

SCons 사용해보기

SCons는 오픈 소스 소프트웨어 구축 도구, 즉 차세대 빌드 도구입니다. SCons는 autoconf / automake 및 ccache와 같은 컴파일러 캐시와 유사한 기능이 통합 된 클래식 Make 유틸리티를 대체하는 향상된 크로스 플랫폼으로 생각하십시오. 요컨대, SCons는 소프트웨어를 구축하는 더 쉽고, 더 안정적이고 빠른 방법입니다.


3
SCons에는 요청한 것과 같은 내장 된 종속성 관리 또는 저장소가 없습니다.
Maxime Viargues 2015 년

-3

모든 빌드 종속성 시스템의 어머니 인 make를 사용하는 것이 좋습니다.


나는 이것을 광범위하게 사용합니다. GCC는 'make'가 먹을 수있는 의존성 파일을 만들 수 있습니다. 다른 답변에 대한 충분한 아마도 ...

8
make는 실제로 모든 사람들이 build -automation- 시스템을 살펴봄으로써 피 / 교체하기를 원하는 것입니다
chila

-6

scons를 시도하면 푹 빠질 것입니다. Make는 오래되고 유지 관리가 어렵고 비용이 많이 듭니다.


Scons를 살펴 보았지만 바이너리 종속성을 관리하는 방법을 찾지 못했습니다. 이에 대한 예가 있습니까?
weberste

1
scons는 파이썬이기 때문에 바이너리 의존성을 매우 쉽게 관리 할 수 ​​있습니다. 바이너리 종속성의 디렉토리에 "SConscript"가있는 것도 도움이 될 것입니다. 여기서 당신의 요구 사항이 무엇인지 잘 모르겠습니다. 페드로.
piotr

16
그래서 당신은 "필요한 것이 무엇인지 잘 모르겠지만 파이썬으로 직접 프로그래밍 할 수 있습니다"를 기반으로 도구를 제안하고 있습니다. 그렇다면 왜 스콘이 필요한가요?
jalf 2011-08-10
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.