Войти
ПрограммированиеФорумФизика

PhysX и навязчивый дебаг режим (2 стр)

Страницы: 1 2
#15
(Правка: 4:47) 4:25, 26 июня 2019

MrShoor
Ладно, комары заели.... Перемещаюсь за компьютер. Щас проверю.

... переместился....

Так. Опять нифига не понял...
Повторяю еще раз: МНЕ НАДО В ДЕБАГ ПРОЕКТЕ использовать РЕЛИЗНУЮ версию библиотеки PhysX. Или по крайней мере отрубить тормоза которые там присутствуют.
Как собрать ДЕБАГ-ДЕБАГ и РЕЛИЗ-РЕЛИЗ я знаю. Не надо мне это разжевывать.
Пример ругани я привел только что бы показать, что тупое подставление релиз PhysX в дебажный проект не проходит.

Я подозреваю. что собака зарыта во флаге '_ITERATOR_DEBUG_LEVEL'. Что это такое (микрософт секретов не выдает) и как с ним бороться - х.з.


#16
(Правка: 5:52) 5:48, 26 июня 2019

san
> Как собрать ДЕБАГ-ДЕБАГ и РЕЛИЗ-РЕЛИЗ я знаю. Не надо мне это разжевывать.

Не, тебе про другое немного рассказывают - каждая сборка (lib, lib+dll или exe) имеет в зависимостях библиотеку рантайма.
И если ты пытаешься скрестить напрямую несколько сборок с разным рантаймом, то там просто одни и те же символы появляться начинают по два разных экземпляра одного и того же и это приводит к ошибкам сборки. Типа как дубликаты символов.
В первую очередь именно для *.lib-ок это актуально, т.к. они по сути внутри сшиваются как раз напрямую. А вот с *.dll-ками как раз может быть полная независимость ввиду даже разных языков, а не просто рантаймов. Но эта строчка сейчас тебе неинтересна, просто для информации.
Поэтому тебе рекомендуют сделать следующее - собрать релизную lib-ку PhysX (т.е. общие настройки проекта -> release) но при этом в её настройках указать, что она использует дебажный рантайм. Тогда возможно при её использовании в дебажном проекте дубликатов рантайма не возникнет.
Как по мне так не факт, но есть шанс что прокатит. Потому что там действительно еще бывают замуты с дефайнами, но надо смотреть.

#17
(Правка: 6:27) 6:15, 26 июня 2019

=A=L=X=
> Поэтому тебе рекомендуют сделать следующее - собрать релизную lib-ку PhysX (т.е. общие настройки проекта -> release) но при этом в её настройках указать, что она использует дебажный рантайм.

Ну я попытался собрать дебажную 4.1 под статическую библиотеку. Фиг фам.
ОК, ладно, тогда запустил Debug сборку 4.0 которая точно собирась и ее либы я собственно и использую. НЕ СОБИРАЕТСЯ! Б....ть!

Валит мессаджи:

Severity  Code  Description  Project  File  Line  Suppression State
Error  LNK2019  unresolved external symbol __imp_PxRegisterArticulations referenced in function "class physx::PxPhysics * __cdecl PxCreatePhysics(unsigned int,class physx::PxFoundation &,class physx::PxTolerancesScale const &,bool,class physx::PxPvd *)" (?PxCreatePhysics@@YAPEAVPxPhysics@physx@@IAEAVPxFoundation@2@AEBVPxTolerancesScale@2@_NPEAVPxPvd@2@@Z)  SnippetBVHStructure  M:\Development\PhysX-4.1\physx\compiler\vc15win64\sdk_snippets_bin\SnippetBVHStructure.obj  1

Нифига не понимаю, ведь раньше-то работало! Для dll и сейчас собирается.... Статическая - хрен вам.
Что интересно, Release собирается, но размер lib всего 64КБ, явно это просто вход в dll, которая 2.4 МБ.

Похоже Микрософт что-то нахомутал со своими апдейтами, поскольку Нвидиа вроде сорс 4.0 не меняла. Короче я остался у разбитого корыта - PhysX сейчас собирается только для dll, а VS не желает собирать разномастные модули со старой сборкой библиотеки (а другую я получить не могу).

Осталось только допить пиво и плюнуть на это на все. Задолбали....

#18
(Правка: 18:56) 18:55, 26 июня 2019

Наконец собрал 4.0 для статической библиотеки - пришлось поправить файл physx\buildtools\presets\public\vc15win64.xml и поставить там "PX_GENERATE_STATIC_LIBRARIES" value = true. Тогда все корректно собирается.
Как я раньше сделал это врукопашную - х.з. Не помню.

=A=L=X=
> Поэтому тебе рекомендуют сделать следующее - собрать релизную lib-ку PhysX (т.е. общие настройки проекта -> release) но при этом в её настройках указать, что она использует дебажный рантайм

Попробовал - не получилось. Не собирается релизная библиотека с /MTD... 
Ладно, тогда поставил в своем проекта в дебажной версии /MT и попробовал собрать ее с релизной версией PhysX.
Тоже не собирается, вылазит диагностика:

Error  LNK2038  mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in 3Dmodels.obj
Error  LNK2038  mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MTd_StaticDebug' in 3Dmodels.obj

Короче диагноз вы правильно поставили, но похоже дело глухое... Если версии рантайм совпали, так флаги не совпадают.

#19
19:09, 26 июня 2019

san
make clean сделай, юниксоид.

#20
19:46, 26 июня 2019

san
Я не знаю в каком проекте у тебя лежит 3Dmodels.cpp, но этот проект у тебя собирается с дебажной версией рантайма. Поменяй этому проекту рантайм на /MT, сейчас у тебя там стоит /MTD

#21
(Правка: 20:23) 20:06, 26 июня 2019

MrShoor
> Я не знаю в каком проекте у тебя лежит 3Dmodels.cpp, но этот проект у тебя собирается с дебажной версией рантайма. Поменяй этому проекту рантайм на /MT, сейчас у тебя там стоит /MTD
Вот смотри:
setting | PhysX и навязчивый дебаг режим

Линкуется с рантайм PhysX.

Результат:
test1 | PhysX и навязчивый дебаг режим

Короче VS, в случае дебажной сборки, устанавливает флаг _ITERATOR_DEBUG_LEVEL = 2, а в релизной сборке PhysX этот флаг установлен в 0.
Обнаружив этот "криминал" VS матерится и прекращает линковку. Откуда берется MTd_StaticDebug я не знаю - перед пересборкой проект был очищен.
Этот модуль (3Dmodels.obj) ничем от других не отличается, разве что он первый по алфавиту.

#22
(Правка: 21:11) 21:10, 26 июня 2019

san
Ну может ты не у того проекта ставишь эти настройки. Я не знаю что там у тебя, но _ITERATOR_DEBUG_LEVEL = 2 по умолчанию устанавливается именно для дебажного рантайма. А для релизного _ITERATOR_DEBUG_LEVEL по умолчанию устанавливается в 0.

Я вот сейчас открыл случайный мелкий проект, и специально сделал так, чтобы у меня была такая же ошибка как у тебя. А потом поменял рантайм на релизный, и все заработало. Вот, смотри:

#23
(Правка: 22:03) 21:59, 26 июня 2019

MrShoor

>не знаю что там у тебя, но _ITERATOR_DEBUG_LEVEL = 2 по умолчанию устанавливается именно для дебажного рантайма. А для релизного _ITERATOR_DEBUG_LEVEL по умолчанию устанавливается в 0.
Ну у меня точно так же (см. пост выше). Основной проект дебажный (флаг 2), библиотека - релиз (флаг 0). Просто несовпадение этих флагов трактуется как ошибка.

> и специально сделал так, чтобы у меня была такая же ошибка как у тебя. А потом поменял рантайм на релизный, и все заработало.
Так у тебя DLL, а это совсем другая история.

#24
(Правка: 22:03) 22:02, 26 июня 2019

san
> У тебя DLL, а это совсем другая история.
Та же история. Мне лень записывать подобное во второй раз. Под рукой у меня нет мелких проектов, скомпилированных под статик, но поверь, история та же, потому что _ITERATOR_DEBUG_LEVEL идет с Debug/Release библиотекой.

#25
22:11, 26 июня 2019

MrShoor

Ладно, устал я с Микрософтом бороться. Фиг знает что там установлено и что от чего зависит.
Так что отбой, всем спасибо, а я поживу пока с тормозами.

Страницы: 1 2
ПрограммированиеФорумФизика