Я бы попросил вашего совета.У меня проблема с компиляцией разделяемой библиотеки в gcc.
Существует несколько шаблонных классов и методов.При оптимизации -o0 каждый экспортируется, как и ожидалось, в -o3 некоторые из них будут скрыты / не скомпилированы / не экспортированы (отчет об этом ясно показывает вывод в нм).Похоже, что методы становятся встроенными, и в этом есть ошибка.Я не вижу другой причины.
Вопрос: Как экспортировать все символы в оптимизации -o3.Почему -o0 производит больше, чем -o3.
Может быть, мне нужна особая обработка в случае шаблонов в общей библиотеке?Например, я должен сделать явную специализацию шаблона?
При необходимости я подготовлю наименьший возможный пример с этой проблемой.
edit:
Код и подробные журналы gcc (o0.log и o3.log) на git hub: https://github.com/MOJNICK/shadow/tree/stack_debug/libcomparator
nm вывод в -O0 (среди прочих не стоит упоминать символы):
./lib/libcomparator.so:00000000000008e0 T instantiate()
./lib/libcomparator.so:000000000000098c W IterateProcess<unsigned char>::color_distance(unsigned char*, unsigned char*)
./lib/libcomparator.so:0000000000000950 W IterateProcess<unsigned char>::iterate_H(unsigned char*, unsigned char*)
./lib/libcomparator.so:0000000000000946 W IterateProcess<unsigned char>::IterateProcess()
./lib/libcomparator.so:0000000000000946 W IterateProcess<unsigned char>::IterateProcess()
./lib/libcomparator.so:0000000000000919 W std::pow(double, int)
нм выход в -O3 (среди прочих не стоит упоминать символы): ./lib/libcomparator.so:00000000000006a0 T instantiate()
libcomparator.hpp
#ifndef COMPARATOR_HPP
#define COMPARATOR_HPP
#include <cmath>
typedef char unsigned UCHAR;
template <class TYPE>
class IterateProcess
{
public:
IterateProcess();
double iterate_H(TYPE* pix0, TYPE* pix1);
double color_distance(TYPE* pix0, TYPE* pix1);
private:
};
#endif
libcomparator.cpp:
#include "libcomparator.hpp"
template <class TYPE> IterateProcess<TYPE>::IterateProcess(){}
template <class TYPE> double IterateProcess<TYPE>::iterate_H(TYPE* pix0, TYPE* pix1)
{
return color_distance(pix0, pix1);
}
template <class TYPE> double IterateProcess<TYPE>::color_distance(TYPE* pix0, TYPE* pix1)
{
double var = -(pix1[0] / static_cast<double>(pix0[0]) + pix1[1] / static_cast<double>(pix0[1]) + pix1[2] / static_cast<double>(pix0[2]));//for minimize color_distance
return std::pow(pix1[0] / static_cast<double>(pix0[0]) + var, 2) + std::pow(pix1[1] / static_cast<double>(pix0[1]) + var, 2) + std::pow(pix1[2] / static_cast<double>(pix0[2]) + var, 2);
}
void instantiate()
{
UCHAR pix [] = {10,10,10};
IterateProcess<UCHAR> specifyIT;
specifyIT.iterate_H(pix, pix);
}
Если вам нужно собрать, сделайте это в Release.Чтобы переключить -O3 на -O0, закомментируйте строку в главном CmakeLists.txt:
string( REPLACE "-O3" "-O0" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})