Qmake: определить целевую разрядность (32-разрядную или 64-разрядную)

У меня есть настройки в моей программе, которые зависят от разрядности цель моей компиляции. В случае 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 перед сборкой моего программного обеспечения. Как только библиотека построена, мое программное обеспечение построено и связано с этой библиотекой.

Корреляция не означает причинно-следственную связь ... То, что void* оказывается 4 или 8, не означает, что вы используете 32- или 64-битную систему. Это похоже на как правило, но он нигде не определен и не стандартизирован.

Some programmer dude 24.10.2018 12:29

@Someprogrammerdude Я не ищу, 32-битный или 64-битный система. Я смотрю, является ли цель 32 или 64-битным. Это проблема, связанная с виртуальной памятью, которая ограничена 4 ГБ для 32-разрядных целей.

The Quantum Physicist 24.10.2018 12:31

Хост или цель не имеют значения, вы все равно не можете использовать ширину указателя, отличную от намекать, для угадывания.

Some programmer dude 24.10.2018 12:33

Зачем для этого вообще нужны qmake или макросы? Просто сделайте обычный if или if constexpr или шаблон с параметром по умолчанию <bool x_32_bit = (4 == sizeof(void *))>

user7860670 24.10.2018 12:35

Может быть, инструкция qmake contains(QMAKE_TARGET.arch, x86_64) даст вам правильный ответ?

vahancho 24.10.2018 12:36

@VTT Библиотека, которой нужен макрос, - это библиотека C. Я не уверен, что могу определить макросы в constexpr в моем C++ 11, который использует библиотеку, но это хорошая идея, чтобы попробовать.

The Quantum Physicist 24.10.2018 12:44

@vahancho Это только для окон. Не работает в Linux. Я это уже пробовал.

The Quantum Physicist 24.10.2018 12:45

@Someprogrammerdude Вы можете компилировать 32-битные программы на 64-битных машинах и даже запускать их. Я не знаю, что вы подразумеваете под подсказкой для предположений, но указатели памяти должны быть выровнены с разрядностью целевой дуги. Можете ли вы привести пример 32-битной цели с 64-битными указателями или наоборот?

The Quantum Physicist 24.10.2018 12:50

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

Some programmer dude 24.10.2018 12:51

@Someprogrammerdude Нет, ты не грубый. Не беспокойся об этом. Мне показалось, что я достаточно ясно сформулировал свой вопрос, поскольку думал, что информация о виртуальной памяти и ее связь с размером указателя известны всем. Я добавлю эту информацию к своему вопросу, и я просто надеюсь, что это не будет звучать педагогически, и именно поэтому я ненавижу эту часть, поскольку я уверен, что большинство из вас, ребята, знают намного больше, чем я.

The Quantum Physicist 24.10.2018 12:56

Я знаю старые исторические гибридные системы, например 16/32 бит MC68000. А на заре мини-компьютеров разрыв между «размером слова» и объемом адресуемой памяти был еще больше. В наши дни, возможно, удастся найти нечто подобное в системах «большого железа». Итак, что вы, В самом деле, пытаетесь выяснить? Разрядность «слова»? Объем адресуемой памяти (и помните, что даже 32-битные системы x86 могут использовать более 32 бит для виртуальной памяти)?

Some programmer dude 24.10.2018 13:00

@Someprogrammerdude Я редактировал вопрос. Надеюсь, это ответ на ваш вопрос. Мне нужно знать объем адресуемой памяти в основном, и, если я правильно понимаю, 32-разрядные системы ограничены 4 ГБ виртуальной памяти.

The Quantum Physicist 24.10.2018 13:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
12
833
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

вы можете добавить в файл .pro что-то вроде

*-64
{
    message( "Building for 64 bit machine...")
}

поэтому при выполнении qmake вы должны увидеть сообщение msg

Building for 64 bit machine...

Я не могу сказать, что это не приходило мне в голову ... это слишком типично, я боюсь, что это может касаться нежелательных случаев ... вам не кажется?

The Quantum Physicist 24.10.2018 16:51

Вы должны иметь возможность использовать макрос в сочетании с константами времени компиляции (но не константами препроцессора) для настройки:

#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-файле, потому что библиотека должна быть создана как часть моей системы сборки. Если это не ответ на ваш вопрос, объясните, какая информация вам нужна.

The Quantum Physicist 24.10.2018 17:20

Что ж, единственным потребителем для определения является код библиотеки, предположительно на C или C++, так как же использовать это определение, которое препятствует описанному выше решению?

Kuba hasn't forgotten Monica 24.10.2018 17:52

Мой файл qmake создает библиотеку как цель, а затем связывает результат библиотеки с моей программой после ее сборки. Я не понимаю, как это можно сделать с помощью предоставленного вами кода. Если можно, объясните, пожалуйста, как это сделать.

The Quantum Physicist 24.10.2018 17:57

Я добавил дополнительную информацию в вопрос о том, как это выглядит в qmake в качестве настраиваемой цели.

The Quantum Physicist 24.10.2018 18:20
Ответ принят как подходящий

В итоге я использовал это решение. Сначала я добавил это для поддержки 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")
}

Узнал об этом от здесь.

Другие вопросы по теме