принудительное связывание файлов cpp в статической библиотеке (визуальная студия)

У меня есть куча файлов cpp (не должно быть файлов заголовков), которые содержат статические переменные. Эти статические переменные, кажется, игнорируются моим компилятором Visual Studio 2008 - как я могу это исправить?

Подробнее:

  • У меня есть абстрактный класс со статическим полем allInstances; когда создается «конкретный» экземпляр моего класса (это происходит, когда создаются экземпляры статических переменных, которые находятся в файлах cpp), указатель на него push_back'ируется во все экземпляры.
  • Файлы Cpp содержат классы, производные от моего абстрактного класса; их реализации должны оставаться в файлах cpp, поскольку они предназначены только для вызова через allInstances.
  • Мои файлы cpp абстрактного класса находятся в папке (проекте), которая компилируется в статической библиотеке.
  • Эта статическая библиотека используется проектом, который компилирует xll

Когда файлы cpp находились в проекте xll, все было в порядке. Но когда я переместил файлы cpp в отдельную папку (это необходимо сделать, потому что excel теперь не единственный интерфейс), мои статические переменные больше не создаются.

У меня есть много этих файлов cpp, и включать их все в каждый из проектов xll, exe, pyd, dll и т. д. было бы нехорошо....

Есть идеи? Спасибо заранее.


person Yulia V    schedule 25.05.2012    source источник
comment
Давно я не работал над MSVS, но вы удостоверились, что опция удаления неиспользуемых объектов не установлена? Если он установлен и компилятор не может определить ссылки на статические переменные, они могут быть удалены. Кроме того, вы можете попробовать volatile-обработать объекты.   -  person ysap    schedule 25.05.2012


Ответы (1)


Вы должны сообщить компоновщику, что соответствующие объектные файлы являются частью программы. Обычно это делается путем указания их как объектных файлов, а не путем помещения их в библиотеку; по определению объектные файлы в библиотеке становятся частью программы только в том случае, если они разрешают внешнюю ссылку.

person James Kanze    schedule 25.05.2012
comment
Спасибо за ответ на мой вопрос, но я не уверен, что полностью вас понимаю. Поскольку эти файлы cpp необходимы в нескольких проектах (проект xll, проект pyd, проект exe, ...), имеет смысл иметь их в отдельной библиотеке, не так ли? Можно ли изменить только файлы cpp (например, добавив «extern», «volatile», ...) или мне нужно иметь какой-то файл заголовка, если я хочу сохранить эти файлы cpp в отдельной библиотеке? Каким будет самый простой (наименьший объем кода ib) способ добиться этого? - person Yulia V; 25.05.2012
comment
По определению, если вы помещаете файлы в библиотеку, вы просите компоновщика использовать только те файлы, которые разрешают неопределенное внешнее. Это то, что делает библиотека. Если это не то, что вам нужно, то библиотека — это не то решение, которое вам нужно. Просто поместите их в каталог, где каждый может их найти. - person James Kanze; 25.05.2012
comment
Если вам действительно нужна библиотека, одним из решений было бы определить внешний символ в каждом источнике с именем, основанным на имени файла, затем автоматически сгенерировать таблицу адресов этих символов и дать ей глобальное имя. Затем клиент каким-то образом ссылается на таблицу и автоматически получает все, на что ссылается таблица. - person James Kanze; 25.05.2012