g ++ создает пустой объектный файл - PullRequest
3 голосов
/ 16 февраля 2012

Я пытаюсь скомпилировать базовый класс шаблона оболочки-массива в файл .o, чтобы попытаться выяснить, как создавать динамические библиотеки.Однако при компиляции источника с

g++ -std=c++0x -c array.cpp

результирующий файл имеет размер всего ~ 650 байт.Я проверил файл с помощью nm и обнаружил, что в нем содержались только символы

00000001 r _ZStL13allocator_arg
00000000 r _ZStL19piecewise_construct

, которые, похоже, являются особенностями компиляции C ++ 11, как при компиляции без флага -std = c ++ 0xони пропали.

Попытка скомпилировать тестовый код программы и все с помощью команды

g++ -std=c++0x -o tester tester.cpp array.cpp

приводит к ошибкам компоновщика для всего в файле array.cpp, но в остальном компилируется чисто.

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

Ответы [ 2 ]

8 голосов
/ 16 февраля 2012

Это нормально. Шаблоны приводят к коду только тогда, когда они созданы , а вы этого еще не сделали. Вы только предоставили шаблон. Пока компилятор компилирует шаблон, у него нет причин генерировать какие-либо конкретные экземпляры шаблона с фактическими типами, заполненными для аргументов шаблона.

Позже компилятор компилирует другие исходные файлы, где вы используете тип шаблона. Это тоже не вызывает инстанцирования. Это просто говорит компилятору, что он должен ожидать найти экземпляры шаблона в другом месте. Компилятор отмечает, что в объектных файлах. Затем компоновщик ищет определения, которые, по словам компилятора, он должен найти, но он не работает.

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

Альтернативой является явное создание экземпляров шаблонов в файле array.cpp , но проще просто определить элементы шаблона встроенными.

0 голосов
/ 16 февраля 2012

Если array.cpp содержит только шаблоны, вы не компилируете его отдельно и, вероятно, называете это array.hpp.

...