Оптимизация — LTO и виртуальный деструктор Переполнение стека

У меня проблемы при компиляции / связывании с LTO, включенным с GCC 4.8.1. Я получаю неопределенные ссылки на символы в DLL, даже если они присутствуют. Странно то, что без LTO он успешно компилируется и связывается. LTO, кажется, испытывает трудности, когда существует виртуальный деструктор, который не был определен в производном классе.

  • Удаление DECLSPEC заставляет его компилироваться и работать с включенным LTO.
  • Ходок за зависимостями показывает символы там. Оптимизатор времени ссылки просто не может их найти.
  • Объявление любого типа деструктора в производном классе Test заставляет это работать.
  • Удаление оптимизации LTO также делает ее успешной, мне интересно, почему это проблема.

Тест является общей библиотекой, основные ссылки на общую библиотеку.

test.h

#include <string>

#ifdef SOURCE
#define DECL __declspec(dllexport)
#warning Exporting!
#else
#define DECL __declspec(dllimport)
#warning Importing!
#endif

class DECL TestBase
{
public:
TestBase(const std::string testing);
virtual ~TestBase();

std::string getTesting();

private:
std::string _testing;
};

class DECL Test : public TestBase
{
public:
Test(const std::string testing);
//~Test(); //removing causes a linker error with LTO! Fine without LTO.
};

test.cpp

#include "Test.h"
TestBase::TestBase(const std::string testing)
{
_testing = testing;
}

TestBase::~TestBase()
{
}

std::string TestBase::getTesting()
{
return _testing;
}

Test::Test(const std::string testing) :
TestBase(testing)
{
}

/*Test::~Test() //removing causes a linker error with LTO! Fine without LTO.
{
}*/

main.cpp

#include "Test.h"#include <iostream>

int main()
{
Test test("testing!");

std::cout << test.getTesting() << std::endl;

return 0;
}

Извините мой грязный makefile ..

CC=g++
LD=g++

LIBCFLAGS= -O3 -march=pentium4 -mfpmath=sse -flto -fuse-linker-plugin
LIBEXTRA= -c -DSOURCE
LIBLDFLAGS= ${LIBCFLAGS} -shared
LIBSOURCES=Test.cpp
LIBRARY=Test.dll

EXECFLAGS= -O3 -march=pentium4 -mfpmath=sse -flto -fuse-linker-plugin
EXTRA= -c
EXELDFLAGS= ${EXECFLAGS} -L. -lTest
SOURCES=Main.cpp
EXECUTABLE=main

LIBOBJECTS=$(LIBSOURCES:.cpp=.o)
OBJECTS=$(SOURCES:.cpp=.o)

all: $(SOURCES) $(LIBRARY) $(EXECUTABLE)

$(LIBRARY): $(LIBOBJECTS)
$(LD) $(LIBLDFLAGS) $(LIBOBJECTS) -o $@

$(EXECUTABLE): $(OBJECTS)
$(LD) $(EXELDFLAGS) $(OBJECTS) -o $@

$(OBJECTS): CFLAGS := $(EXECFLAGS) $(EXTRA)
$(LIBOBJECTS): CFLAGS := $(LIBCFLAGS) $(LIBEXTRA)

.cpp.o:
@echo "...  Making: $@"$(CC) $(CFLAGS) $< -o $@

clean:
- del /f /q *.o
- del /f /q *.dll
- del /f /q *.exe

2

Решение

Задача ещё не решена.

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

Других решений пока нет …

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