Pergunta

Eu tenho um grande corpo de código, compilado com /MT (i.e.esperando para ligar estaticamente contra o CRT).Preciso combinar isso com uma estática de biblioteca de terceiros, que foi construído com /MD (i.e.esperando para ligar o CRT dinamicamente).

É teoricamente possível ligar os dois em um executável sem recompilar quer?

Se eu vínculo com /nodefaultlib:msvcrt, eu termino com um pequeno número de referências indefinidas para coisas como __imp__wgetenv.Estou tentado a tentar implementar essas funções em meu próprio código, o encaminhamento para wgetenv, etc.É que vale a pena tentar, ou será que eu corro direto para a próxima problema?

Infelizmente, eu estou Proibida de tomar a opção fácil de embalagem o código de terceiros em uma DLL separada :-/

Foi útil?

Solução

Não./MT e /MD são mutuamente exclusivos.

Todos os módulos passado para uma dada a invocação do vinculador deve ter sido compilado com a mesma biblioteca de tempo de execução do compilador opção (/MD, /MT, /LD).

Origem

Outras dicas

Encontrei essa solução em fontes OpenSSL: todos os arquivos OBJ da biblioteca são compilados com combinação: /MT /Zl. Como o autor descrito, essa combinação permite construir biblioteca estática com capacidade de compilar com os aplicativos CRT dinâmico (/MD) ou CRT estático (/MT).

Eu enfrentei situação semelhante onde eu tinha duas bibliotecas foi construído com MT e outro com MD.Eu tinha que criar um executável que usa funcionalidades de ambas as bibliotecas.A biblioteca construída como MD foi terceiros, assim eu não conseguia reconstruído e biblioteca construída como MT tem muitas dependências e construída todos eles como MD é uma grande dor.Eu estava chegando de erro a partir do terceiro config arquivo de cabeçalho que tornou obrigatória para construir o executável como MD.Eu estava procurando a maneira mais fácil de embalagens de terceiros dll como uma dll separada como mencionado na questão.No entanto, eu não conseguia encontrar explicações online nesta forma fácil.Portanto, meus dois centavos abaixo.A seguinte é a minha maneira de evitá-lo

  1. Construí outro .dll que atuou como uma interface.Esta interface, basicamente, envolto todas as chamadas de api que foi feita para terceiros dll.O arquivo de cabeçalho para esta interface não incluir qualquer arquivo de cabeçalho de terceiros dll ao invés de todos os arquivos de cabeçalho foram incluídos no interface.cpp arquivo.Interface de como você espera foi construído como MD.
  2. Agora Na minha main.cpp arquivo eu incluído este arquivo de cabeçalho de interface para fazer todas as chamadas para terceiros dll através da interface.

  3. Cuidado Extra deve ser tomado a passagem de argumentos para a interface.Variáveis básicos como int,bool, etc pode ser passada como valor.No entanto, qualquer classe ou estrutura precisa ser passado como constante referência a evitar a corrupção de heap.Isto é aplicável mesmo a cadeia.

Feliz em compartilhar mais detalhes, se não está claro!

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