Gerenciamento de dependência semelhante ao Maven para C ++? [fechadas]


94

Digamos que eu tenha um projeto C ++ dividido em vários subprojetos. Todos os subprojetos produzem uma DLL e diferentes equipes de desenvolvedores trabalham em cada um dos subprojetos. Agora, se eu quiser construir o projeto principal, há uma maneira de evitar ter que construir todos os subprojetos sozinho?

Resumindo, estou procurando algo que faça o gerenciamento de dependências (ou seja, para arquivos binários e cabeçalhos) de maneira semelhante ao que o Maven faz para Java.

Na verdade, eu tentei usar o Maven para isso, mas isso é um pouco complicado porque tenho que criar os pacotes manualmente e com bastante frequência, o Maven deixa de selecionar as alterações mais recentes. Além disso, executar a compilação é um pouco complicado, pois tenho que chamar o NAnt de dentro do Maven (eu uso o recurso do NAnt para construir soluções do Visual Studio diretamente).

Alguma dica e ideia de como fazer isso?


O problema ao usar make é que tenho que construir tudo pelo menos uma vez e, portanto, também preciso dos arquivos de origem para as dependências. Especialmente, ao reconstruir bibliotecas dependentes, pode ser muito demorado e afetar severamente a produtividade. Ou eu estou esquecendo de alguma coisa?
weberste

3
Esta parece ser uma pergunta útil. Talvez essa pergunta possa ser transferida para outro site que seja mais receptivo a essas perguntas? Estou procurando as melhores práticas para gerenciamento de dependência c ++.
simgineer

Isso está cerca de 10 anos atrasado, então há 3 possibilidades aqui: você está usando mal maven, está perdendo o ponto principal maven, ou 10 anos atrás, quando eu não estava usando mavenpara C ++, era muito menos útil para C ++. Não posso falar sobre 2009, mas nos últimos anos, por experiência, mavené exatamente o que você usaria para o problema que está descrevendo. Ele faz exatamente o que você quer, de forma bastante eficiente e bem, e não faz as coisas negativas que você afirma que faz. Qualquer pessoa que ler isso em 2019 ou posteriormente deve considerar o uso mavenpara essa finalidade.
searchengine27 de

Respostas:


37

Resposta inicial : Eu sugeriria o uso do CMake. É um gerador de arquivos multiplataforma (também gera projetos Visual Studio ou Eclipse CDT).

http://www.cmake.org/

Eu fiz uma experiência muito boa com isso. A melhor coisa que gosto nisso é a capacidade de produzir uma estrutura de projeto genérica. Portanto, você pode incluir genericamente a pesquisa de subprojetos para testes de unidade, etc., sem alterar o script todas as vezes.

Eles também têm muitos módulos sobre como encontrar bibliotecas de compilação pré-instaladas, necessárias para o projeto (como Boost, QT etc.)


Atualização : nesse meio tempo, houve algum esforço para introduzir o gerenciamento de pacotes para C ++. Alguns projetos que vale a pena conferir:

  • conan.io integra-se com as principais ferramentas de construção:
    • CMake
    • Estúdio visual
    • Makefile
    • XCode
    • ...
  • cpm com base no CMake ( observe que o CPM não está sendo mantido ativamente.)
  • Buckaroo

Nota, conforme apontado por @RAM nos comentários, cpm não é mais mantido ativamente.


7
Usei o CMake há alguns meses e, de fato, verificar as bibliotecas pré-instaladas funcionou muito bem. No entanto, outras dependências binárias (ou seja, as que vêm de meus subprojetos) não podiam ser gerenciadas facilmente. Estou esquecendo de algo?
weberste

3
@weberste, Na verdade não existe uma ferramenta do tipo maven para C / C ++. Os desenvolvedores tentam lidar com o gerenciamento de dependências com uma ferramenta semelhante ao apt-get.
SunnyShah

1
cpm não é mantido ativamente e está morto desde o início de 2015.
RAM

@RAM: obrigado por apontar isso. Eu adicionei uma nota no post com referência a você.
ovanes

2
CMake é um sistema de construção com capacidade limitada de localizar dependências. Não é um gerenciador de dependência no sentido de NPM, Cargo, etc.
sdgfsdh

17

Para o gerenciamento de dependências, existe um novo projeto (é uma empresa startup) que está implementando este tipo de ferramenta: https://github.com/biicode (um gerenciador de dependências C ++). Você pode adicionar suas dependências e deve funcionar.

Atualmente, o nome do projeto é conan.io , eles foram adquiridos pela JFrog .

ATUALIZAÇÃO: O projeto está morto ... Infelizmente, parece que a inicialização não conseguiu clientes pagantes premium suficientes, mas o servidor parece estar funcionando bem ...

ATUALIZAÇÃO2: Parece que existe um projeto substituto: conan.io (obrigado @mucaho)


Posso remover o link .. o projeto foi encerrado, agora é conan.io
carlos.baez

Obrigado pela atualização! Na maior parte do tempo, estou olhando por curiosidade, parece que ainda é possível vasculhar o github para obter a documentação ; provavelmente não é tão bom quanto o que estava no site em um ponto, mas acho que é melhor do que nada. Basta saber, conan.io é apenas uma rebrand ou é um produto totalmente diferente?
jrh

1
Não é uma reformulação da marca, mas um projeto completamente novo do zero com todas as lições aprendidas: código totalmente aberto, totalmente descentralizado com um servidor interno, suporta todos os sistemas de construção, gerencia binários.
drodri

8

Eu recomendo os seguintes sistemas de construção de alto nível:


Plugin Maven Nar obtendo bom suporte. Eu usei e gostei até agora. No entanto, você precisa entender que o Maven não é bom para um repo mono. A maioria das soluções C ++ precisa de um repositório Mono para lidar com bibliotecas de compartilhamento e tal.
Hans

5

Se você quer apenas gerenciamento de dependências, experimente o Ivy , ele se integra perfeitamente ao Ant (e eu suponho que o NAnt possa fazer o mesmo com base neste blog , que tem um link do site do Ivy).

Também existe o Byldan , uma versão .Net do Maven. Não sei se isso funcionará bem para você.


3

Make e GCC são uma ótima combinação para uma verificação de dependência realmente boa.

O GCC pode gerar arquivos de dependência 'make' automaticamente (opção de linha de comando -MD), de modo a ser capaz de reconstruir todos os arquivos de origem que dependem de um determinado cabeçalho, por exemplo.

Eu tenho algumas regras simples que recorte e colo em meus 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 $@

Agora, se seus arquivos objeto são declarados em uma lista OBJ_C e OBJ_CPP:

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

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

O Make pode, é claro, rastrear dependências com outros projetos e outros, por exemplo, reconstruindo uma biblioteca compartilhada conforme necessário.

Por exemplo, se suas outras equipes sempre colocam suas DLLs mais recentes em alguma pasta compartilhada:

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

veja meu comentário anexado à pergunta sobre minhas preocupações com esta solução
weberste

Se um destino depende de outro arquivo, por exemplo, seu executável depende de uma biblioteca compartilhada, você pode ter uma regra para essa biblioteca compartilhada que garante que sua cópia da biblioteca está atualizada sem precisar da fonte, por exemplo, simplesmente buscando a cópia mais recente de um local específico ou da execução de alguma atualização de controle de versão ou algo semelhante.
Será

${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@Tive dificuldade em analisar todos esses símbolos de Make, parece que isso resolve para algo como g++ -c main.cc -MD -MF testse você deseja executá-lo autônomo na linha de comando e coloca os resultados em um arquivo chamado 'teste'.
jrh


2

Eu recomendo o conan , que eu estava usando atualmente. É muito poderoso manter todas as bibliotecas e binários dependentes em seu projeto.


1

Você pode criar o pacote NuGet para bibliotecas usadas e usar o NuGet para gerenciamento de dependências.

Veja também, NuGet para C ++


1
NuGet é uma extensão do Visual Studio
Toughy

@Toughy, ele também pode ser usado como um gerenciamento de dependência autônomo. (Arquivo executável 4M)
Yousha Aleayoub

0

Há uma série de ferramentas no topo do SCons, fornecendo funcionalidade de nível superior semelhante à do Autotools que estão tentando tornar a vida do desenvolvedor mais fácil (por exemplo, WAF, SNOCS). Infelizmente, o próprio SCons tem a maior desvantagem - maior tempo de compilação para grandes projetos.

Recomendo experimentar SNOCS (que é um SCons invertido) para aqueles que procuram um gerenciamento de dependência fácil e escolhem opções de compilação em um único comando (compilador, x86 / x64, Debug / Release, bibliotecas estáticas / compartilhadas, teste / instalar alvos, etc.).

SNOCS também tenta resolver o problema de longo tempo de compilação, armazenando a saída de configuração do projeto em arquivos separados, o que permite que as compilações subsequentes ignorem a fase de configuração e vão direto para a fase de construção (o último recurso está em construção agora)

A configuração do CMake se torna tediosa em soluções maiores, então a manutenção do sistema de construção leva uma grande fração do tempo do desenvolvedor. Felizmente como o Martijn já mencionou, existe o biicode que "usa o CMake para gerar seu projeto com suas dependências".


-1

Experimente SCons

SCons é uma ferramenta de construção de software de código aberto - ou seja, uma ferramenta de construção de última geração. Pense no SCons como um substituto de plataforma cruzada aprimorado para o utilitário Make clássico com funcionalidade integrada semelhante ao autoconf / automake e caches de compilador como o ccache. Resumindo, o SCons é uma maneira mais fácil, confiável e rápida de criar software.


3
SCons não tem nenhum gerenciamento de dependência ou repositório embutido como solicitado.
Maxime Viargues

-3

Eu recomendo usar a mãe de todos os sistemas de dependência de construção: make.


Eu uso isso extensivamente. O GCC pode criar arquivos de dependência que o 'make' pode comer. O suficiente para outra resposta, talvez ...
Será que

8
make é realmente o que todo mundo quer evitar / substituir olhando para sistemas de automação de construção
chila

-6

Experimente scons, você ficará viciado. Make é desatualizado, difícil e caro de manter.


Dei uma olhada no Scons, mas não encontrei uma maneira de gerenciar dependências binárias. Você tem um exemplo para isso?
weberste

1
Como scons é python, você pode codificar o que quiser para gerenciar suas dependências binárias com bastante facilidade. Talvez ter um "SConscript" no diretório de suas dependências binárias também ajude. Não tenho certeza de quais são seus requisitos aqui difíceis. Pedro.
piotr

16
Então você está sugerindo uma ferramenta baseada em "Não tenho certeza do que você precisa, mas você pode programá-la em Python". Por que você precisa de scons então?
jalf
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.