Eu escrevi uma entrada de blog sobre isso, pois encontrei esse problema enlouquecedor e finalmente coloquei meu sistema de volta à ordem de funcionamento.
Estas são as coisas a serem verificadas, nesta ordem:
Verifique as opções de propriedades nas configurações do vinculador em: Propriedades> Propriedades de configuração> Vinculador> Avançado> Máquina de destino. Selecione MachineX64 se você estiver direcionando uma compilação de 64 bits ou MachineX86 se estiver fazendo uma compilação de 32 bits.
Selecione Build> Configuration Manager no menu principal do visual studio. Verifique se o seu projeto tem a plataforma correta especificada. É possível que o IDE seja configurado para criar x64, mas um projeto individual na solução pode ser definido para atingir o win32. Então, sim, o visual studio deixa muita corda para se enforcar, mas isso é vida.
Verifique se os arquivos de sua biblioteca realmente são do tipo de plataforma que estão segmentando. Isso pode ser usado usando o dumpbin.exe, que está no diretório VC \ bin do visual studio. use a opção -headers para despejar todas as suas funções. Procure a entrada da máquina para cada função. deve incluir x64 se for uma compilação de 64 bits.
No visual studio, selecione Ferramentas> Opções no menu principal. selecione Projetos e soluções> Diretórios VC ++. Selecione x64 no menu suspenso Plataforma. Verifique se a primeira entrada é: $ (VCInstallDir) \ bin \ x86_amd64 seguida por $ (VCInstallDir) \ bin .
Depois que dei o passo 4, tudo funcionou novamente para mim. O problema era que eu estava encontrando esse problema em todos os meus projetos nos quais queria compilar em direção a um destino de 64 bits.
Além da lista de C Johnson, eu acrescentaria o seguinte ponto:
Verifique no Visual Studio:
Propriedades do projeto -> Propriedades de configuração -> Vinculador -> Linha de comando.
"Opções adicionais" NÃO devem conter
/machine:X86
Eu tenho essa chave, gerada pela saída do CMake: o CMake gerou o projeto x86 e adicionei a plataforma x64
Configuration Manager
no Visual Studio 2010 - tudo foi criado corretamente para a nova plataforma, exceto que a linha de comando do vinculador foi especificada/machine:X86
separadamente.fonte
Tive o mesmo problema no VS2008 quando tentei adicionar uma compilação X64 a um projeto convertido do VS2003.
Eu olhei para tudo o que encontrei ao procurar esse erro no Google (máquina de destino, diretórios VC ++, DUMPBIN ....) e tudo parecia bem.
Finalmente, criei um novo projeto de teste e fiz as mesmas alterações e parecia funcionar.
Fazer uma diferença entre os arquivos vcproj revelou o problema ....
Meu projeto convertido tinha / MACHINE: i386 definido como opção adicional definida em Linker-> Linha de Comando. Portanto, havia duas opções / MACHINE configuradas (x64 e i386) e a opção adicional teve preferência.
Removê-lo e configurá-lo corretamente em Linker-> Avançado-> Target Machine fez o problema desaparecer.
fonte
Todas as configurações do projeto pareciam perfeitas, mas ainda assim recebi o erro. Examinar o
.vcxproj
arquivo e procurar por "x86" revelou o problema:Uma pesquisa / substituição rápida de todas as ocorrências (dez configurações de arquivo individuais) solucionou o problema.
fonte
Como o problema ocorre devido à diferença nas especificações de compilação e destino da máquina (x86 e x64), siga as etapas abaixo:
Isso resolveu meu problema.
fonte
Você provavelmente tem um arquivo .OBJ ou .LIB direcionado para x64 (esse é o tipo de máquina do módulo) enquanto está vinculando para x86 (esse é o tipo de máquina de destino).
Use DUMPBIN / HEADERS nos arquivos .OBJ e verifique a entrada da máquina no bloco FILE HEADER VALUES.
fonte
No Visual Studio 2012 +/-, a página de propriedades de "Propriedades da Configuração" .Linker. "Linha de Comando" contém uma caixa denominada "Opções Adicionais". Se você estiver criando x64, verifique se a caixa não contém / MACHINE: I386. Meus projetos fizeram e gerou o erro em questão.
fonte
Me deparei com esse problema ao criar QT. As instruções que li em algum lugar sugeriram que eu configurasse o nmake usando o prompt de comando do VS.
Eu escolhi o prompt de comando x64 e executei o configure sem muito aborrecimento. Quando eu tentei nmake, deu esse erro.
Eu acho que alguns dos componentes foram pré-criados para 32 bits. O erro ainda relatava quais módulos foram criados para o x86.
Eu usei o prompt de comando padrão do VS de 32 bits e funcionou.
fonte
No Visual Studio 2013,
1) Verifique nas páginas de propriedades do projeto / propriedades de configuração / vinculador / todas as opções e corrija todas as máquinas e diretórios configurados incorretamente.
2) Verifique nas páginas de propriedades do projeto / propriedades de configuração / vinculador / entrada e corrija todos os diretórios configurados incorretamente.
Veja o exemplo de 1)
fonte
O arquivo vcxproj pode conter 'MACHINE: i386' Edite o arquivo vcxproj com o editor. remova !
fonte
Defina a opção de compilação de 64 bits
-m64 -cubin
A dica está no log de compilação. Como isso:
Este
"-machine 32"
é problema.Primeiro, defina a opção de compilação de 64 bits, a seguir redefina a opção de compilação híbrida. Então você pode ver o sucesso.
fonte
Se sua solução possui projetos lib, verifique a propriedade Target Machine em Property-> Librarian-> General
fonte
Além da lista de Jhonson, verifique também as pastas da biblioteca
No visual studio, selecione Ferramentas> Opções no menu principal. selecione Projetos e soluções> Diretórios VC ++. Selecione x64 no menu suspenso Plataforma.
fonte
Isso aconteceu comigo hoje porque eu adicionei um diretório de biblioteca ainda no modo x86 e removi acidentalmente os diretórios herdados, tornando-os codificados permanentemente. Depois de mudar para x64, meus diretórios VC ++ ainda leem:
"...; $ (VC_LibraryPath_x86); $ (WindowsSDK_LibraryPath_x86);"
em vez do _x64.
fonte
$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;
Eu estava usando o CMake e, em seguida, adicionei uma configuração win32. A página de propriedades mostrava x86, mas na verdade ao abrir o arquivo vcxproj em um editor de texto, era x64! Alterar manualmente para x86 resolveu isso.
fonte
É um problema muito frustrante e irritante, mas quando você o entende, é bastante simples: você tem algum elemento para criar um tipo de arquitetura (no seu caso x64), apesar de ter sido alvo de outro tipo (por exemplo, x86 )
Você pode dissecar a fonte do seu problema observando qual arquivo obj está causando o travamento e começar a procurar o problema lá. Todo objeto terá um código-fonte analógico: em cpp, c, asm etc. Pode haver eventos especiais de compilação ao redor dele que estejam usando a ferramenta errada. Verifique isso nas folhas de propriedades.
Eu procuraria lá primeiro antes de passar pela lista de coisas a fazer pela C Johnson.
fonte
Resolvi esse problema alterando o Win32 para * 64 no Visual Studio 2013.
fonte
O tipo de máquina do módulo é a máquina na qual você está compilando e o tipo de máquina de destino é a arquitetura x86 ou x64 para a qual você está construindo seus binários.
fonte
Esse problema também pode ocorrer se o seu projeto estiver configurado para ter os mesmos diretórios intermediários em Propriedades do projeto -> Propriedades da configuração -> Geral
fonte
Antes de tudo, tente o seguinte: 1. vá para o Configuration Manager e crie um novo x64 se ele ainda não estiver lá. 2. selecione a solução x64. 3. acesse as propriedades do projeto e, em seguida, Linker-> Advanced selecione x64 machine. 4. Agora, reconstrua a solução.
Se ainda assim você está recebendo o mesmo erro. tente uma solução limpa e depois reconstrua novamente e abra o visual studio. Você receberá uma lista dos projetos abertos recentes, clique com o botão direito do mouse no projeto e remova-o de lá. Agora vá para a solução e reabra a solução novamente.
fonte
isso acontece comigo quando eu converter minha solução VS2008 para VS2010 e alterar a configuração do win32 para X64, na minha solução antiga tenho mfcs90d.lib (Configuração-> Vinculador-> Entrada-> Dependências adicionais), pois estou usando o VS010 e acabei de verificar na pasta VS2010, onde está mfcs100d.lib, então mudei mfcs90d.lib para mfcs100d.lib em (Configuração-> Linker-> Entrada-> Dependências adicionais) funcionou bem.
fonte
Para quem está com o QT Creator, o problema é o mesmo (conforme descrito por @ c-johnson). Verifique se as configurações do compilador para MSVC no seu kit estão definidas como x86, como mostrado abaixo.
fonte
para alguns que usam o prompt de comando (prompt dos), isso pode ser útil:
Também se você faz assim:
CL "% 1% 2% 3" / EHsc / link user32.lib Gdi32.lib Winmm.lib comctl32.lib * .obj / SUBSISTEMA: CONSOLE / MACHINE: x86
você precisa del * .obj antes ; evitar confundir o vinculador com objetos de 64 e 32 bits que sobraram de compilações anteriores?
fonte
Muitas boas sugestões acima.
Além disso, se você estiver tentando criar no x86 Win32:
Verifique se as bibliotecas às quais você vincula os Arquivos de programas (x86) são na verdade bibliotecas x86, porque não são necessariamente ...
Por exemplo, um arquivo lib ao qual vinculei em C: \ Arquivos de Programas (x86) \ Microsoft Visual Studio \ 2019 \ Professional \ SDK lançou esse erro; eventualmente, encontrei uma versão x86 em C: \ Arquivos de Programas (x86) \ Windows Kits \ 10 \ Lib \ 10.0.18362.0 \ um \ x86 e tudo funcionou bem.
fonte
o que é o sistema operacional? se for um Windows x64, é necessário certificar-se de que o CUDA x64 foi instalado e, portanto, o VS2008 deve compilar o projeto no modo x64 ...
O CUDA instalará apenas x64 OU x86 no Windows
fonte