Сборка проекта VC ++ на x64, не может быть выполнена на x86 - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть неуправляемый проект VC ++, который я могу построить для целей как x86, так и x64. Он используется программой .NET, скомпилированной для любого процессора. Это на VS2010, но у меня была та же проблема, когда решение было построено с VS2008 и vcbuild.

Вот команда build в моем скрипте сборки:

msbuild .\Project.vcxproj /t:Build /p:PlatformToolset=v100 /p:Configuration=Release /p:Platform=%platform%

Если сборка на компьютере с архитектурой x86, с% платформой% = Win32, все собирается и работает нормально

Если сборка на компьютере x64, с% platform% = x64, все собирается и работает нормально.

Однако, если я собираюсь на x64-машине, с% platform% = Win32, он собирается успешно, без ошибок. Но когда я копирую эти предположительно x86-файлы на компьютер x86, они вызывают следующую ошибку:

System.Runtime.InteropServices.SEHException was caught
  Message=External component has thrown an exception.

Отследив эту ошибку до DLL C ++, она не удалась в этой строке:

if ( FAILED( g_Connection.CreateInstance( _T("ADODB.Connection") ) ) )
    ThrowException(_T("Cannot create connection."));

Я просмотрел файл .vcxproj в поисках проблем, но все выглядит правильно. Там нет импортированных файлов свойств или пользовательских задач сборки или чего-то подобного.

Это вызывает проблемы, потому что мы пытаемся использовать один сервер сборки x64 для создания сборок для обеих платформ. Наш текущий обходной путь включает в себя предварительную сборку C ++ dll на двух разных машинах.

1 Ответ

0 голосов
/ 06 апреля 2011

Я проследил проблему до этой строки, хитро спрятанной в одном из заголовочных файлов:

#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","EndOfFile")

Это всегда будет связывать dll x86 с x64-версией msdado15.dll при сборке на компьютере x64 - независимо от целевой платформы сборки.

Я решил это, скопировав файлы ADO для обеих платформ в каталог моего проекта и обновив проект и заголовок:

#import "msado15.dll" no_namespace rename("EOF","EndOfFile")

.vcxproj file: (показаны только соответствующие строки)

<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <ClCompile>
      <AdditionalIncludeDirectories>.\ado\Win32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <ClCompile>
      <AdditionalIncludeDirectories>.\ado\x64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ClCompile>
</ItemDefinitionGroup>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...