У меня есть решение 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, поэтому выходные данные представляют собой один исполняемый файл.
Символы из проекта 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Глобальный находится в одном месте в пространстве памяти процесса. Если у вас есть два процесса, которые совместно используют модуль, у каждого из них будет отдельная переменная, да.
Вам нужно будет использовать IPC для обмена данными между процессами.