Несколько экземпляров глобальных данных при связывании в несколько проектов

У меня есть решение Visual C ++, которое состоит из 3 проектов.

Один из этих проектов, проект «А», используется обоими другими проектами и содержит глобальные данные, которые всегда должны быть одинаковыми.

Однако, когда я связываю проект A с обоими другими проектами, кажется, что два экземпляра проекта A работают с разными данными.

Может ли это быть так, и как я могу настроить процесс связывания, чтобы предотвратить это?

— Обновление, чтобы сделать вещи более понятными

- Project 1 -

main () {
init();
test();
}

- Project 2 -

test () {
cout << get_data();
}

- Project A -

int data;

init() {
data = 123;
}

get_data() {
return data;
}

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

Оба проекта A и 2 статически связаны в проект 1, поэтому выходные данные представляют собой один исполняемый файл.

3

Решение

Символы из проекта A в статической библиотеке связаны как с проектом 1, так и с проектом 2, отдельно. Их объединение включает в себя специфичные для компилятора механизмы.

По сути, вы должны сделать проект 2 реэкспортировать символы проекта А, и проект 1 должен импортировать их вместо непосредственного импорта проекта А.

Если вы не можете этого сделать (например, потому что у вас нет контроля над проектом 1 или 2), вы должны написать обходные пути внутри проекта A. Один из вариантов (обычно самый простой) — преобразовать проект A в динамическую библиотеку. Затем оба проекта 1 и 2 загружают один и тот же экземпляр проекта A, и данные становятся общими.

Другой вариант — изменить проект A так, чтобы он не имел глобальной переменной, а вместо этого регистрировал глобальный элемент данных процесса, содержащий нужные данные; например, вы можете использовать локальную таблицу атомов [1] для хранения указателя на динамическую память.

[1] http://msdn.microsoft.com/en-us/library/windows/desktop/ms649053%28v=vs.85%29.aspx#_win32_Integer_Atoms

0

Другие решения

Глобальный находится в одном месте в пространстве памяти процесса. Если у вас есть два процесса, которые совместно используют модуль, у каждого из них будет отдельная переменная, да.

Вам нужно будет использовать IPC для обмена данными между процессами.

2

По вопросам рекламы [email protected]