Итак, у меня странная проблема. Я делаю простой вызов PInvoke, чтобы получить логическое значение из управляемого кода.
C / C++
Q_DECL_EXPORT bool net_variant_getBool(NetVariantContainer* container)
{
bool result = container->variant->getBool();
// This function will only return the right value if I use the following code in OSX in release mode (debug works with or without it).
// qDebug("Return value is: %d", result);
return result;
}
C#
[DllImport("QmlNet.dylib")]
static extern bool net_variant_getBool(IntPtr variant);
Приведенный выше код, как есть, отлично работает в Linux / Windows как в режиме отладки, так и в режиме выпуска, а также в OSX только в режиме отладки.
В OSX в режиме выпуска результирующее значение в C# неверно. Если я попытаюсь записать, что такое возвращаемый bool (чтобы выяснить проблему), он распечатает правильное значение, и тогда возвращается правильное значение!. Верно, закомментированный макрос qDebug
выше будет исправить моей проблемой, если он скомпилирован. Wth?
Эта проблема возникает только в режиме Release на OSX / clang.
Вот результат компиляции в OSX как для отладочной, так и для выпускной сборок. https://gist.github.com/pauldotknopf/3949b7e86d6a4bfb59788dd0b7c44536
Я совершенно потерялся. У кого-нибудь есть идеи? Я не хочу отправлять отладочные библиотеки!
Оказывается, bool
- это непреобразуемый тип, и его нельзя использовать в качестве возвращаемого значения. См. здесь.
Я изменил свой код, чтобы вместо этого возвращать byte
.