erro fatal LNK1112: o tipo de máquina do módulo 'x64' entra em conflito com o tipo de máquina de destino 'X86'

187

Estou usando o CUDA (VC ++, Visual studio 2008sp1) para depurar um programa FEM. O programa só pode ser executado em uma plataforma Win32, devido à insuficiência de cuda. Eu acho que os arquivos de biblioteca vinculados são todos compilados na plataforma x86, mas quando eu o compilo, recebo a mensagem de erro "erro fatal LNK1112: o tipo de máquina do módulo 'x64' entra em conflito com o tipo de máquina de destino 'X86'".

Eu tentei converter a plataforma para x64, mas não funcionou. Por favor, diga-me: o que é "tipo de máquina de módulo" e o que é "tipo de máquina de destino"? Como posso superá-lo?

user430382
fonte

Respostas:

262

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

C Johnson
fonte
6
Poupança de vida. Também no passo 4, o "Diretórios Library" também precisa ser atualizado para os caminhos de 64 bits
Gregory
37
Para aqueles que usam Visual Studio 2013 - etapa 4 foi substituído, agora você fazer a mudança nas propriedades do projeto -> propriedades de configuração -> Diretórios VC ++ - Biblioteca Diretórios
polymesh
3
Se você estiver usando uma biblioteca externa que foi compilada como x86, também receberá esse erro. Eu o encontrei ao tentar criar um projeto usando as bibliotecas do Teste do Google.
precisa saber é o seguinte
3
Se eu não tenho um arquivo de projeto (executando o nmake em um Makefile), como faço a mesma coisa?
user118967
3
Como você pode fazer isso na linha de comando, em vez de criar um projeto na versão da GUI?
repzero
152

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 Managerno Visual Studio 2010 - tudo foi criado corretamente para a nova plataforma, exceto que a linha de comando do vinculador foi especificada /machine:X86separadamente.

sergtk
fonte
20
Este foi exatamente o meu problema! Mas foi um projeto do Visual Studio 2017 gerado pelo CMake em que usei o Gerenciador de Configurações para criar configurações de compilação da plataforma x64 (onde as configurações de compilação do Win32 foram copiadas para criar as configurações de compilação x64). O que acontece é que as configurações "/ MACHINE:" do vinculador entre "Todas as opções -> Opções adicionais" e "Avançado -> Máquina de destino" entram em conflito. Para corrigir, basta excluir a configuração "Todas as opções-> Opções adicionais" -> "/ MACHINE:".
precisa saber é o seguinte
2
Isso provavelmente me salvou horas. Obrigado!
rsp1984
3
Esta foi a solução para mim, então só queria agradecer, estranhamente, eu já havia votado, então eu deveria estar aqui antes com o mesmo problema! :)
Adam Dempsey
1
Pequena variante desta solução: alguns projetos na minha solução não têm "Linker" em Propriedades de configuração. Em vez disso, eles têm "bibliotecário". Nesses casos, o Bibliotecário -> Todas as opções -> Opções adicionais disse / machine: x86 enquanto o Bibliotecário -> Todas as opções -> Target Machine disse / machine: x64. Excluí o x86 do Bibliotecário -> Todas as opções -> Opções adicionais ... e as coisas finalmente foram criadas e vinculadas.
Xenial 6/02/19
Obrigado por estas dicas. Parece ser um problema comum para os usuários do CMake. Up vote.
Hao Xi
54

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.

Zid
fonte
8
Esse também era exatamente o meu problema - mas isso veio de uma solução do Visual Studio que foi criada usando o CMake. Parece que o CMake também gosta de adicionar esta opção.
Nick Chadwick
4
Eu vim de um projeto do CMake e posso confirmar que ele adicionou essa opção.
BeeOnRope 12/06
25

Todas as configurações do projeto pareciam perfeitas, mas ainda assim recebi o erro. Examinar o .vcxprojarquivo e procurar por "x86" revelou o problema:

<Lib>
  <AdditionalOptions> /machine:X86 %(AdditionalOptions)</AdditionalOptions>
</Lib>

Uma pesquisa / substituição rápida de todas as ocorrências (dez configurações de arquivo individuais) solucionou o problema.

lama12345
fonte
3
Também em Propriedades do projeto -> Opções de configuração -> Bibliotecário -> Todas as opções -> Opções adicionais.
Xenial 6/02/19
13

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:

  1. Abra o projeto C ++ que você deseja configurar.
  2. Escolha o botão Gerenciador de Configurações para abrir a caixa de diálogo Gerenciador de Configurações.
  3. Na lista suspensa do Active Solution Platform, selecione a opção para abrir a caixa de diálogo New Solution Platform.
  4. Na lista suspensa Digite ou selecione a nova plataforma, selecione uma plataforma de 64 bits.

Isso resolveu meu problema.

hab
fonte
12

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.

Patrick
fonte
3
Essa foi a causa raiz para mim quando encontrei essa mensagem de erro. Eu havia construído anteriormente para uma arquitetura e não havia limpado adequadamente os arquivos e bibliotecas de objetos dessa compilação anterior. Depois de excluir todos os arquivos .obj e .lib antigos da compilação anterior, pude compilar meu projeto com a nova arquitetura.
Ben
Esse era o meu problema e a solução era limpar antes de criar ao alterar as arquiteturas de destino.
7

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.

laloumen
fonte
4

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.

pvairam
fonte
4
Isso me colocou no caminho certo. Se você estiver construindo para 64 bits, poderá usar este atalho do Windows para configurar seu ambiente: C: \ Windows \ System32 \ cmd.exe / A / Q /KC:\Qt\Qt5.1.1\5.1.1\msvc2012_64 \ bin \ qtenv2.bat e "C: \ Arquivos de Programas (x86) \ Microsoft Visual Studio 11.0 \ VC \ vcvarsall.bat" x86_amd64 & cd c: \ YourDir A parte importante disso é o x86_amd64 - sem que o ambiente esteja definido como um ambiente de 32 bits e o qmake pega como tal.
Gremwell #
3

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)

fabceolina
fonte
2

O arquivo vcxproj pode conter 'MACHINE: i386' Edite o arquivo vcxproj com o editor. remova !

Mark Yang
fonte
1
"project property - CUDA Runtime API - GPU - NVCC Compilation Type"

Defina a opção de compilação de 64 bits -m64 -cubin

A dica está no log de compilação. Como isso:

nvcc.exe ~~~~~~ -machine 32 -ccbin ~~~~~

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.

chang
fonte
1

Se sua solução possui projetos lib, verifique a propriedade Target Machine em Property-> Librarian-> General

Rinat
fonte
1

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.

$(VCInstallDir)lib\AMD64;
$(VCInstallDir)atlmfc\lib\amd64;
$(WindowsSdkDir)lib\x64;
Igor Barbarian
fonte
1

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.

masterxilo
fonte
Obrigado. Esse foi o meu problema. Para futuros leitores, o meu "Diretórios Biblioteca" agora lê$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;
Phlox Midas
1

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.

grunhido
fonte
2
Eu tinha algo parecido. Não sei qual configuração estava escondida onde (e segui o conselho da maioria das respostas aqui), mas especificar o gerador adequadamente fez isso por mim: cmake. -G "Visual Studio 12 Win 64".
user55937
1

É 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
1

Resolvi esse problema alterando o Win32 para * 64 no Visual Studio 2013.

Salman Saleh
fonte
0

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.

djs
fonte
0

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

Anton K
fonte
0

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.

Digvijay Rathore
fonte
0

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.

NDestiny
fonte
0

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.

Configurações do kit QT Creator para o compilador MSVC x86

Jimson Kannanthara James
fonte
0

para alguns que usam o prompt de comando (prompt dos), isso pode ser útil:

call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" --help
Error in script usage. The correct usage is:
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" [option]
  or
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" [option] store
  or
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" [option] [version number]
  or
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" [option] store [version number]
where [option] is: x86 | amd64 | arm | x86_amd64 | x86_arm | amd64_x86 | amd64_arm
where [version number] is either the full Windows 10 SDK version number or "8.1" to use the windows 8.1 SDK
:
The store parameter sets environment variables to support
  store (rather than desktop) development.
:
For example:
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_arm store
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64 10.0.10240.0
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_arm store 10.0.10240.0
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 8.1
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 store 8.1
:
Please make sure either Visual Studio or C++ Build SKU is installed.

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?

kris2k
fonte
0

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.

GrahamJ
fonte
-1

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

Conor
fonte
Parece ser um erro ao criar e tentar vincular. Basicamente, é uma incompatibilidade ou inconsistência nas configurações de compilação; a plataforma de destino que pode ser especificada como um parâmetro para várias etapas de construção não é consistente.
Shamri #