Как разделить глобальные переменные между двумя исполняемыми файлами?

#c #compilation #global-variables

#c #Сборник #глобальные переменные

Вопрос:

Итак, допустим, у меня есть два файла, main1.cc и main2.cc , каждый с функцией main и каждый с набором глобальных переменных, определенных в их соответствующих файлах:

main1.cc:

 int main1_global = 1;

int main() {
  // I am main 1
}
 

main1_globals.h:

 extern int main1_global;
 

main2.cc:

 #include "main1_globals.h"

int main2_global = 2;
int main() {
  // I am main 2
}
 

Проблема в том, что main2.cc использует main1_global, и если я пытаюсь связать и скомпилировать main2, то он жалуется, что существует несколько определений main .

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

Комментарии:

1. Но у вас есть несколько определений main . Это не разрешено.

2. Отредактировал мой пост, потому что это было непонятно. Я знаю, что существует два определения main, просто интересно, какой наилучший способ включить глобальные переменные main1 в main2 без привязки main1.

3. я не понимаю. Что именно означает «поделиться»? Должна ли модификация main1_global в executable1 быть видимой в executable2? (Интересно, можно ли было бы модифицировать компоновщик для размещения глобальных переменных в общей памяти …)

4. О, так вы написали 2 main s, потому что пытаетесь решить проблему «совместного использования глобальных переменных»? Если это так, вопрос вводит в заблуждение; он читается так, как будто у вас уже было 2 main s по какой-то другой причине.

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

Ответ №1:

Поместите ваши константы в отдельный файл, например globals.h . Затем включите этот файл в оба ваших исполняемых файла.

Комментарии:

1. вы инициализируете и определяете глобальные переменные в globals.h?

2. Как будет выглядеть этот файл, если оба модуля .c будут включать его?

Ответ №2:

Как разделить глобальные переменные между двумя исполняемыми файлами?

В большинстве операционных систем каждый исполняемый файл (полученный путем компиляции и последующего связывания файлов C ) выполняется в своем собственном процессе, и каждый процесс имеет свое собственное виртуальное адресное пространство. Подробнее читайте в каком-нибудь хорошем учебнике по операционным системам.

На практике вы не можете легко совместно использовать глобальные переменные, а когда вы могли бы, возникает проблема синхронизации (что произойдет на многоядерном процессоре, когда на одном ядре одновременно выполняется исполняемый файл 1, а на другом — исполняемый файл 2?).

Вы, вероятно, хотите некоторого взаимодействия между процессами. Когда это возможно, совместное использование глобальной переменной может быть дорогостоящим в процессорном времени.

Если в Linux, см. системные вызовы (2), mmap(2), канал (7), сокет (7), опрос (2), shm_overview(7), sem_overview(7)

Для Windows изучите WinAPI

Вы могли бы перепроектировать архитектуру своего программного обеспечения для использования многопоточности, например, C std::thread -s, но тогда вам, вероятно, понадобятся также std::mutex для целей блокировки и std::condition_variable -s для синхронизации.

Имейте в виду проблемы с кэшем процессора и когерентностью кэша. Даже если вы используете глобальную переменную, у вас могут возникнуть проблемы с производительностью.

Вы можете перепроектировать свое приложение, чтобы использовать парадигму передачи сообщений, например, с помощью JSONRPC, MPI или ONCRPC. Конечно, отправка сообщения обходится дорого (но это основа облачных вычислений в центрах обработки данных). Это может занять миллисекунды, а не наносекунды.