Pergunta

Eu estou tentando criar uma biblioteca c ++ para uso em windows / MSVC.

O meu problema é que parece que para ligação corretamente, eu preciso distribuir um monte de versões diferentes, ligados contra versões diferentes de tempos de execução do MSVC c ++ - single e multi-threaded, depuração e liberação, diferentes versões do compilador, vários outra garantia e outras opções.

Eu adoraria apenas distribuir talvez dois, 32 bits e 64 bits.

A minha ideia é talvez usar um novo operador diferente (digamos, mynew) e alocadores personalizados para todos os tipos minhas STL. Ao criar o lib, / NODEFAULTLIB. Então, quando ligar a partir de um projeto pai, obrigá-los a conversão mynew de novo, e meu stl alocador para o padrão (ou uma de sua escolha). Eu acho que eu preciso fazer de exclusão, e algumas outras funções. Naturalmente eu fornecer uma implementação exemplo thunking com a biblioteca, mas isso poderia vir a salvar a todos um monte de dor de cabeça.

Isso é possível? Alguém já tentou isso? Existe uma das melhores práticas para a criação de biblioteca / distribuição em windows / MSVC?

Foi útil?

Solução

Você quer vinculação estática, como uma resposta geral.

Breve nota sobre a resposta de Chris (não quero de-boost porque é principalmente bom, mas ...):

NÃO conectar-se a msvcrt.dll (aquele sem versão); esta é a versão DLL específico do OS, e se você ligar para ele, seu aplicativo provavelmente não irá funcionar em outras versões do Windows. Você deve sempre estar ligando para msvcrt ##. Dll, tanto quanto eu sei. O DDK pode conter um lib para ele, mas não link para ele a menos que você realmente saiba o que está fazendo.

Outras dicas

Fazer a ligação estaticamente para C ++ biblioteca de tempo de execução:

  1. Abra as propriedades do projeto.
  2. Vá para Propriedades de configuração | C / C ++ | Geração de código seção.
  3. Set Runtime Library para Multi-threaded (/ MT).

Você não precisa usar um alocador de costume, se você estiver usando C ++, e você envolve todas as alocações em torno std::tr1::shared_ptr (onde você pode especificar uma função de desalocação). Isso garante que mesmo quando os clientes liberar a última referência para o ponteiro compartilhada, ainda é o código em sua biblioteca (ou CRT da sua biblioteca) que é chamada quando o objeto é para ser liberado.

Esta é uma maneira de resolver "DLL hell limite". Espero que ajude! : -)

Edit: Eu acho que descaracterizou a intenção da sua pergunta. Ao invés de não querer qualquer dependência de um CRT, porque você está preocupado com DLL inferno limite, suponho que só queria uma versão do seu DLL que você pode instalar em qualquer lugar. Nesse caso, você pode fazer o seu link de programa para msvcrt.dll. Que está disponível em qualquer sistema Windows.

Você não ouviu isso de mim, mas aparentemente no Driver Development Kit pode encontrar algum tipo de biblioteca de importação que permite que versões mais recentes do Visual Studio para link para msvcrt.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top