módulo inseguro para imagem SAFESEH C ++

86

Estou usando o Microsoft Visual Studio 2011 Professional Beta

Estou tentando executar os arquivos OpenCV C ++ ( http://opencv.willowgarage.com/wiki/Welcome ) que compilei usando cMake e Visual Studio Complier.

No entanto, quando vou depurar o projeto, recebo mais de 600 erros, a maioria deles:

erro LNK2026: módulo inseguro para imagem SAFESEH.

Aparentemente, esses arquivos estão no projeto opencv_ffmpeg, mas não consegui localizá-los. Dei uma olhada na página Safe Exception Handlers do safeseh na página de ajuda da Microsoft, mas não consegui encontrar respostas definitivas.

Eu queria saber se mais alguém teve esse problema e se eles conseguiram corrigi-lo.

Aaron Thompson
fonte
12
Isso acontece quando você vincula um .obj ou .lib que contém o código criado por uma versão anterior do compilador. O que, claro, seria comum se você baixasse um binário para opencv_ffmpeg em vez do código-fonte. Você pode desativar a opção de vinculador, mas ainda terá uma incompatibilidade de versão CRT que pode ocorrer byte. Reconstrua a biblioteca da fonte.
Hans Passant
Obrigado pela ajuda, funcionou
Aaron Thompson
@HansPassant O que fazer quando não há fonte?
GregC
4
O óbvio: peça ao proprietário do código para fornecer uma atualização.
Hans Passant
@HansPassant Espero que o fornecedor ainda esteja por perto para fazer uma atualização. Soa como um tipo de problema do tipo "fator de caminhão de um".
GregC

Respostas:

63

Dos comentários:

Isso acontece quando você vincula um .obj ou .lib que contém o código criado por uma versão anterior do compilador. O que, claro, seria comum se você baixasse um binário para opencv_ffmpeg em vez do código-fonte. Você pode desativar a opção de vinculador, mas ainda terá uma incompatibilidade de versão CRT que pode ocorrer byte. Reconstrua a biblioteca da fonte. - Hans Passant 15 de maio às 13:01  
 
Obrigado pela ajuda, funcionou - Aaron Thompson 17 de maio às 14:50

Bo Persson
fonte
Também pode ser causado por, como estados de erro, módulos para os quais o vinculador não consegue encontrar manipuladores de exceção seguros. Módulos de linguagem assembly em particular - conforme discutido em outras respostas. Há algumas informações sobre isso aqui .
Nick Westgate
147

Desativar a opção "A imagem tem manipuladores de exceção seguros" nas propriedades do projeto -> Propriedades de configuração -> Vinculador -> guia Avançado me ajudou.

Zhenya
fonte
3
Isso não teve nenhum efeito para mim.
Pop-A-Stash
Da mesma forma para mim. O problema parece ser que, embora eu possa escolher SAFESEH: NO no submenu Advanced Options nas configurações do vinculador, ele não permanecerá escolhido. Sempre reverte para SEGURANÇA: SIM.
user382459
Sucesso, com VS 2013 Express
gbarry
1
Sucesso, VS 2015
2
Sucesso, VS 2017
ke4ktz
12

Se você recebeu este erro ao criar ZLIB no Visual Studio, aqui está a solução. Procure contrib\masmx86\bld_ml32.bate adicione /safesehcomo uma opção

Antes

ml /coff /Zi /c /Flmatch686.lst match686.asm
ml /coff /Zi /c /Flinffas32.lst inffas32.asm

Depois de

ml /safeseh /coff /Zi /c /Flmatch686.lst match686.asm
ml /safeseh /coff /Zi /c /Flinffas32.lst inffas32.asm
Nayana Adassuriya
fonte
Eu tive o mesmo problema com o zlib, mas tive que alterar os adereços nos .asmarquivos no gerenciador de soluções.
Cillié Malan
11

Outra maneira é adicionar algum manipulador SEH (vazio, por exemplo) aos arquivos asm e compilá-los com a /safesehopção, depois compilar outro código normalmente com a /SAFESEH:YESopção do compilador.

Manipulador SEH vazio:

.safeseh SEH_handler

SEH_handler   proc
;handler
ret

SEH_handler   endp
DitherSky
fonte
1
Não me incomodei em adicionar um manipulador à fonte de terceiros (zlib), /safesehparece o suficiente. Isso realmente deveria ser votado positivamente!
mlt
2
Qualquer pessoa com os mesmos problemas com o zlib veja este (CTRL + F safeseh) tannerhelland.com/5076/compile-zlib-winapi-wapi-stdcall
codekiddy
Eu adicionei "/ safeseh" à linha de comando nas propriedades do arquivo .asm e funcionou.
Norbert Boros
0

Sua milhagem pode variar, mas nenhuma das sugestões acima funcionou para mim (embora eu não tenha tentado rolar meu próprio manipulador de exceção de conjunto).

O que funcionou foi selecionar Release / x64 de destino de compilação.

Estou executando o Windows 10 em uma máquina de 64 bits e usando o Visual Studio 2015.

O Release / Win32 de destino também funciona. Acho que o principal é escolher "Release".

Bob Stine
fonte