Линкер бросает глобалов (и их конструкторы) из статической библиотекиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Линкер бросает глобалов (и их конструкторы) из статической библиотеки

Сообщение Anonymous »

У меня есть реестр Синглтона, который отображает имена для функционирования указателей. У меня также есть объект регистратора, конструктор которого регистрирует указатель функции. Для краткости я заменил указатели функций с указателями на глобальные INT и ассоциативный контейнер реестра на вектор.

Код: Выделить всё

// registry.h
#include 
std::vector &GetRegistry();
< /code>
// registry.cpp
#include "registry.h"

std::vector &GetRegistry() {
static std::vector registry;
return registry;
}
< /code>
// thingadder.h
#include "registry.h"

class ThingAdder {
public:
explicit ThingAdder(int const *thing) {
GetRegistry().push_back(thing);
}
};
< /code>
// things.cpp
#include "thingadder.h"

int g_thing1 = 1;
ThingAdder g_adder1(&g_thing1);
< /code>
// main.cpp
#include "registry.h"
#include 
#include 

int main() {
std::print("registry size: {}\n", GetRegistry().size());
return 0;
}
Если все файлы скомпилированы и связаны как один проект, конструктор G_ADDER1 добавляет адрес G_GLOBAL1 к реестру, и программа сообщает, что размер реестра 1. Сообщаемый размер реестра равен 0. Похоже, что глобальные в вещах. CPP были опущены по ссылке. Но это правда, даже когда он построен как монолит. Я бы не ожидал объединить эту часть в статическую библиотеку, чтобы изменить поведение. < /P>
Решения? В реальной библиотеке будет зарегистрировано больше файлов объектов, и я не хочу, чтобы каждый пользователь библиотеки добавил ссылку на символ для каждого из них.


Подробнее здесь: https://stackoverflow.com/questions/795 ... ic-library
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»