У меня есть настройки в моей программе, которые зависят от разрядности цель моей компиляции. В случае 32-битной ширины необходимо определить специальный макрос из-за ограничений памяти.
I не смог найти способ в qmake для определения разрядности цели, в то время как такая же опция доступна в cmake с: CMAKE_SIZEOF_VOID_P
; где 8 - 64-битный, а 4 - 32-битный.
Есть что-то подобное для qmake?
Обновлено: Справочная информация о проблеме, как указано в комментариях
Часть 1: Есть библиотека C, которую я использую в своей программе на C++ 11, которой нужен макрос, чтобы действовать по-другому в 32-битных системах.
Часть 2: В 32-битных системах память ограничена 4 ГБ виртуальная память. Даже если вы используете 64-разрядную систему и компьютер, и даже если у вас есть 500 ГБ памяти подкачки, 32-разрядная программа не может использовать более 4 ГБ. Вот почему в библиотеке, которую я использую, есть специальные настройки для 32-разрядной версии, чтобы ограничить объем используемой памяти. Следовательно, мне нужно знать, компилируем ли мы для 32-битной цели (например, Raspberry Pi), чтобы активировать требуемый макрос.
Часть 3: Библиотека построена как настраиваемая цель в qmake перед сборкой моего программного обеспечения. Как только библиотека построена, мое программное обеспечение построено и связано с этой библиотекой.
@Someprogrammerdude Я не ищу, 32-битный или 64-битный система. Я смотрю, является ли цель 32 или 64-битным. Это проблема, связанная с виртуальной памятью, которая ограничена 4 ГБ для 32-разрядных целей.
Хост или цель не имеют значения, вы все равно не можете использовать ширину указателя, отличную от намекать, для угадывания.
Зачем для этого вообще нужны qmake или макросы? Просто сделайте обычный if
или if constexpr
или шаблон с параметром по умолчанию <bool x_32_bit = (4 == sizeof(void *))>
Может быть, инструкция qmake contains(QMAKE_TARGET.arch, x86_64)
даст вам правильный ответ?
@VTT Библиотека, которой нужен макрос, - это библиотека C. Я не уверен, что могу определить макросы в constexpr в моем C++ 11, который использует библиотеку, но это хорошая идея, чтобы попробовать.
@vahancho Это только для окон. Не работает в Linux. Я это уже пробовал.
@Someprogrammerdude Вы можете компилировать 32-битные программы на 64-битных машинах и даже запускать их. Я не знаю, что вы подразумеваете под подсказкой для предположений, но указатели памяти должны быть выровнены с разрядностью целевой дуги. Можете ли вы привести пример 32-битной цели с 64-битными указателями или наоборот?
Извините за грубость, но если вам нужно сообщить нам важные детали в комментариях, значит, вы не написали хороший вопрос. Пожалуйста, укажите такие подробности, как хост и целевая платформа, что вы пробовали, и что произошло, когда вы это пробовали, и т. д. Чем больше деталей вы предоставите в своем вопросе, тем меньше мы должны будем спрашивать здесь в комментариях.
@Someprogrammerdude Нет, ты не грубый. Не беспокойся об этом. Мне показалось, что я достаточно ясно сформулировал свой вопрос, поскольку думал, что информация о виртуальной памяти и ее связь с размером указателя известны всем. Я добавлю эту информацию к своему вопросу, и я просто надеюсь, что это не будет звучать педагогически, и именно поэтому я ненавижу эту часть, поскольку я уверен, что большинство из вас, ребята, знают намного больше, чем я.
Я знаю старые исторические гибридные системы, например 16/32 бит MC68000. А на заре мини-компьютеров разрыв между «размером слова» и объемом адресуемой памяти был еще больше. В наши дни, возможно, удастся найти нечто подобное в системах «большого железа». Итак, что вы, В самом деле, пытаетесь выяснить? Разрядность «слова»? Объем адресуемой памяти (и помните, что даже 32-битные системы x86 могут использовать более 32 бит для виртуальной памяти)?
@Someprogrammerdude Я редактировал вопрос. Надеюсь, это ответ на ваш вопрос. Мне нужно знать объем адресуемой памяти в основном, и, если я правильно понимаю, 32-разрядные системы ограничены 4 ГБ виртуальной памяти.
вы можете добавить в файл .pro что-то вроде
*-64
{
message( "Building for 64 bit machine...")
}
поэтому при выполнении qmake вы должны увидеть сообщение msg
Building for 64 bit machine...
Я не могу сказать, что это не приходило мне в голову ... это слишком типично, я боюсь, что это может касаться нежелательных случаев ... вам не кажется?
Вы должны иметь возможность использовать макрос в сочетании с константами времени компиляции (но не константами препроцессора) для настройки:
#define TARGET_64 (sizeof(void*) == 8)
#define TARGET_32 (sizeof(void*) == 4)
Затем, например, чтобы изменить объем выделенной памяти:
char buffer1[TARGET_32 ? 0x10000000 : 0x40000000];
char *buffer2;
void foo(void) {
buffer2 = malloc(TARGET_32 ? 0x10000000 : 0x40000000);
}
Вероятно, нет необходимости тестировать макрос с #ifdef
- если вы думаете, что он есть, вам нужно будет указать код темы в своем вопросе.
Мне нужно сделать глобальный #define ABC
, если он 32-битный. Определение должно быть сделано в make-файле, потому что библиотека должна быть создана как часть моей системы сборки. Если это не ответ на ваш вопрос, объясните, какая информация вам нужна.
Что ж, единственным потребителем для определения является код библиотеки, предположительно на C или C++, так как же использовать это определение, которое препятствует описанному выше решению?
Мой файл qmake создает библиотеку как цель, а затем связывает результат библиотеки с моей программой после ее сборки. Я не понимаю, как это можно сделать с помощью предоставленного вами кода. Если можно, объясните, пожалуйста, как это сделать.
Я добавил дополнительную информацию в вопрос о том, как это выглядит в qmake в качестве настраиваемой цели.
В итоге я использовал это решение. Сначала я добавил это для поддержки Linux:
linux-g++:QMAKE_TARGET.arch = $$QMAKE_HOST.arch
linux-g++-32:QMAKE_TARGET.arch = x86
linux-g++-64:QMAKE_TARGET.arch = x86_64
а затем это:
contains(QMAKE_TARGET.arch, x86_64) {
message("Compiling for a 64-bit system")
} else {
DEFINES += ABC
message("Compiling for a 32-bit system")
}
Узнал об этом от здесь.
Корреляция не означает причинно-следственную связь ... То, что
void*
оказывается4
или8
, не означает, что вы используете 32- или 64-битную систему. Это похоже на как правило, но он нигде не определен и не стандартизирован.