Как создать проект Visual C ++, ориентированный на конкретную распространяемую версию Visual C ++

У меня есть собственная библиотека C ++, которую я создаю с помощью Visual Studio 2005, которая является частью более крупного проекта.

Этот проект обычно содержит несколько других dll, включая библиотеки распространяемого пакета Microft C ++ (например, msvcr80.dll). Таким образом, мы можем развернуть наш проект, не заставляя пользователя устанавливать распространяемый пакет Microsoft Visual C ++ 2005.

Проблема в том, что всякий раз, когда я помещаю свою библиотеку в этот более крупный проект, я получаю следующую ошибку:

This application has failed to start because the application configuration is incorrect. Reinstalling application may fix this problem.

Чтобы решить эту проблему, я просмотрел, какую версию Visual Studio CRT использовала моя dll и какую ее версию использовал более крупный проект, и, как оказалось, они разные.

Ниже приведен манифест для более крупного проекта:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <noInheritable></noInheritable>
    <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.4053" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</assembly>

И вот что я получил из своей библиотеки:

<dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
</dependency>

Затем я провел небольшое исследование в Интернете и обнаружил как минимум два способа вручную изменить CRT-версию моей dll.

Первый - установить в моем проекте следующий макрос:

#define _CRT_ASSEMBLY_VERSION "8.0.50727.4053"

А второй подробно описан в этом сообщении.

Я пробовал их оба, но ни один из них не работал.

Что касается первого, я добавил _CRT_ASSEMBLY_VERSION в один из файлов заголовков моего проекта, но не изменил его версию CRT. Также, если у меня более одного проекта, нужно ли мне добавлять этот макрос ко всем из них?

Что касается второго, я изменил манифест моей библиотеки на:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.4053' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
        </dependentAssembly>
    </dependency>
</assembly>

Но теперь моя библиотека создается без тега внутри.

Наконец, обратите внимание, что я очень предпочитаю, если бы я мог использовать первый метод, поскольку он проще и что-то, что входит прямо в код, поэтому мне не нужно постоянно помнить о необходимости поддерживать отдельный файл манифеста для моих проектов.


person Felipe    schedule 18.06.2012    source источник
comment
У вас установлен 2005 SP1? Как насчет того, где строится более крупный проект?   -  person Joe    schedule 18.06.2012
comment
А 2005 использовать обязательно?   -  person stanri    schedule 18.06.2012
comment
Привет, да, на моем компьютере установлен 2005 SP1. Также я думал о создании своего проекта на той же машине, на которой построен основной более крупный проект, однако это строго контролируемая среда, и я не смогу установить там зависимости, необходимые для моего проекта. Итак, пока я должен заставить все работать с моей нынешней машиной.   -  person Felipe    schedule 18.06.2012
comment
@SRK, да, к сожалению, я застрял в Visual Studio 2005.   -  person Felipe    schedule 18.06.2012
comment
Вы пробовали перестроить свой проект верхнего уровня? Я смутно помню, как он исправлял вариант №2 выше.   -  person stanri    schedule 18.06.2012
comment
Установлен ли на основной машине проекта 2005 SP1?   -  person Joe    schedule 18.06.2012
comment
@Joe, да, на главном компьютере проекта установлена ​​Visual Studio 2005, однако этот компьютер обычно не обновляется, это объясняет разницу между версиями CRT для моего проекта и основного проекта.   -  person Felipe    schedule 18.06.2012
comment
@SRK, я попытался перестроить свой проект, но ничего не вышло. DLL все еще создается без тега ‹dependency›.   -  person Felipe    schedule 18.06.2012


Ответы (1)


однако это строго контролируемая среда

В чем проблема, эта машина не получила последних обновлений безопасности для CRT. Если этот компьютер также является создателем установщика, тогда вы обязательно столкнетесь с описанной вами проблемой: вы запрашиваете версию DLL, которая недоступна на машине.

Развертывание файлов на компьютере пользователя, имеющего известные проблемы с безопасностью, определенно является своего рода политикой, которую необходимо пересмотреть. Определение макроса _CRT_ASSEMBLY_VERSION - правильный подход, но рассмотрите возможность установки этого макроса в настройках проекта вместо исходного файла, чтобы вы могли быть абсолютно уверены, что он установлен до того, как vc / include / crtassem.h получит #included. Проект + Свойства, C / C ++, Препроцессор, Настройка определений препроцессора.

И да, конечно, на всех ваших проектах.

person Hans Passant    schedule 18.06.2012