Skip to Content

Microsoft Visual Studio

Q: InstallShield Limited Edition и вообще про инсталляторы.

Прошу прощения что я не о выборах, но вот такие вот практические вопросы.

Вопрос номер раз

  1. Visual Studio 2010, хочу сделать проект изготавливающий инсталлятор. Ну значит New Solution - и там есть пимпа "Enable InstallShield LE".
  2. Жму в пимпу, мне предлагают этот InstallShield скачать. Скачиваю, запускаю инсталлятор.
  3. Инсталлятор инсталлирует, говорит что надо Studio перезапустить.
  4. Перезапускаю. Одновременно прилетает письмо с серийником.
И вот теперь имею проблему:
  • Куда нужно сунуть серийник - просто не понимаю. Все меню облазил, не нашел.
  • InstallShield-проект создать нельзя. Не создается, failed и все.
Кто виноват и что делать?

Про существование NSIS знаю, но хотел попробовать с InstallShield, чтобы вообще понимать чего хотеть.

О семантике C++

В продолжение кулуарного разговора с Highload++, навеянного 26-м слайдом презентации Андрея Аксенова.

Вот такой вот код:

  1. class someShit{
  2.         char *m_sBuffer;
  3.         size_t m_iLimit, m_iCounter;
  4. };
  5. void someShit::try1()
  6. {
  7.         m_iCounter = 0;
  8.         while (m_iCounter< m_iLimit && m_sBuffer[m_iCounter])
  9.                 m_iCounter++;
  10. }
  11.  
  12. void someShit::try2()
  13. {
  14.         size_t l_iCounter = 0;
  15.         while (l_iCounter< m_iLimit && m_sBuffer[l_iCounter])
  16.                 l_iCounter++;
  17.         m_iCounter = l_iCounter;
  18. }
Компиляторы (смотрел gcc 4.6, Visual Studio 2010 и Intel 11.0, все с включенной стандартной оптимизацией -O3/O2 без тонких настроек) делают разное:
  • gcc и Visual Studio генерируют код с той семантикой, какой написано;
  • Intel C++ делает так же, если компилирует "библиотеку", но оптимизирует первый случай до второго, если все потроха (методы класса и вызывающий их main()) лежат в одном файле.

О компиляторах и процессорах: AVX

Армянское радио Нас спрашивают:

Как измениться производительность intrinsic варианта на Core-i7, если поменять
_mm_dp_ps на _mm256_dp_ps
_mm_blend_ps на _mm_blend256_ps

То-есть насколько вырастить производительность если мы совсем на AVX переедем и будет обрабатывать по 8 float за проход? А то слухи разные ходят... от 0% до 200% роста.

Отвечаем:

Visual Studio .sln/.vcproj generator?

По многочисленным просьбам трудящихся, я поставляю вместе с LibRaw еще и .sln/.vcproj файлы для MS Visual Studio.

Генерирую я их с помощью Qmake и все более-менее работает, но:

  • Иногда (когда Юпитер в Рыбах?) в sln-файле вместо относительных путей оказываются полные, приходится ручками чистить.
  • Проекты содержат AdditionalIncludeDirectories указывающие (абсолютным путем) на mkspecs от моего Qmake.
  • Можно сгенерировать проект для 32-бит, вроде бы можно (хотя не пробовал) для 64 бит, а вот под две платформы сразу - не умеет.
  • Была еще проблема с зависимостями (exe - dll), ибо зависимости ловятся искуственным интеллектом, но вроде я научился добиваться от него счастья.
  • Достали win32:/unix: конструкции в .pro-файлах, блин.
Короче, неаккуратненько, неровно висят.

Попробовал CMake и счастья еще меньше, проекты ALL_BUILD и ZERO_CHECK раздражают мое эстетическое чувство. При этом проблема абсолютных путей не решена, а дальше я копать не стал и CMake снес.

Что я упустил? Какой еще есть варез, который нагенерирует мне sln/vcproj из простых текстовых файлов?

О консистентности

Чтобы на времени компиляции убедиться в том, что у нас MS Visual C++ 2008 SP1+, нужно забабахать вот такое вот:
  1. #if defined(_MSC_VER) && _MSC_VER == 1500 && _MSC_FULL_VER >= 150030729

Ну ладно, ну вот лично я бы две старших цифры в _MSC_VER занял бы под major версию, а две младших - под minor (сервис-паки, то-се), ну ладно, пусть будет два макроса.

Опять-таки, ладно, что MS Visual C++ 2008 это на самом деле Visual C++ 9.0, а _MSC_VER у него 1500. Ну логично же, да?

Но покажите мне пожалуйста табличку в официальной документации (на MSDN, например), где были бы перечислены версии компиляторов и против каждой версии было бы написано значение _MSC_VER и прочих макросов, важных для определения версии компилятора. blogs.msdn и social.msdn не принимаются, я хочу именно что документацию

А если эта табличка там есть (я не нашел), то какой осмысленный запрос надо вфигачить в поиск по MSDN, чтобы искомый документ оказался в первой тройке.

P.S. Нет, я не привередничаю. OpenMP в нужном мне виде правильно работает в VC++ 2010 и в 2008SP1, я и хочу чтобы оно собиралось бы с OpenMP на вышеуказанных версиях, а на более старых - и не думало бы. Аналогичный случай имеется с C++ TR1, который, вроде бы, человеческим тоже стал в 2008SP1.

P.P.S. В blogs.msdn.com, в каментах, сотрудник MS пишет что надо делать вот так:

  1. #if defined(_MSC_VER) && (_MSC_FULL_VER > 150021022 || _MSC_FULL_VER == 150021022 && _MSC_BUILD >= 8)
  2.        cout << "This is VC9 RTM or above." << endl;
  3. #endif
  4.  
  5. #if defined(_MSC_VER) && (_MSC_FULL_VER > 150030729 || _MSC_FULL_VER == 150030729 && _MSC_BUILD >= 1)
  6. cout << "This is VC9 SP1 or above." << endl;
  7. #endif
У меня нет слов. Еще и _MSC_BUILD (которого нету в VC8/2005 и более старых).

...может задолбать небольшого слона....

Все-таки я продолжаю считать, что кавардак с многочисленными несовместимыми рантаймами не украшает Microsoft Windows вообще и MSVC в частности.

Ситуация:

  • Свежий Qt 4.7.2, собранный (в Нокии) MSVC 2008
  • Мой варез, который я собираю лично MSVC 2010
До вчерашнего дня у меня был Qt 4.7.1 собранный самостоятельно (тем же MSVC 2010) и все было отлично. Заменяю Qt на DLL, собранные в Нокии, qmake (перегенерация мейкфайлов т.е. ключи компиляции гарантированно правильные), перекомпилирую, и что имею:
  • В целом варез работает.
  • В частностях валится с грохотом, где-то в недрах (отладчик, впрочем, говорит что Heap Corrupted т.е. эти недра - опять аллокаторы).

Ну кто так строит.....

С лета у меня висела плавающая бага, все руки не доходили.

Суть в том, что в LibRaw внутри аллоцируется кусок памяти, отдается вызвавшему приложению, а оно, когда с ним наиграется, должно освободить его путем банального free()

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

Syndicate content


.