Название: Undefined reference для функции определенной ВНУТРИ проекта.
Отправлено: Blackwanderer от Июня 26, 2010, 15:53
Добрый день. Есть проект (библиотека). В качестве IDE - QtCreator. Есть следующие файлы: point2d.h#ifndef POINT2D_H #define POINT2D_H
#include "geometry_global.h"
//================================================================================================================================ // Точка в двумерном пространстве. //================================================================================================================================ class GEOMETRY_EXPORT Point2D { public: Point2D(); Point2D(double xc, double yc);
double x() const; double y() const; void setX(double xc); void setY(double yc);
friend inline bool operator==(const Point2D &p1, const Point2D &p2); friend inline bool operator!=(const Point2D &p1, const Point2D &p2); friend inline const Point2D operator-(const Point2D &point);
private: double m_x; double m_y; };
#endif // POINT2D_H
point2d.cpp#include "point2d.h"
//================================================================================================================================ //================================================================================================================================ inline Point2D::Point2D() : m_x(0.0), m_y(0.0){} inline Point2D::Point2D(double xc, double yc) : m_x(xc), m_y(yc){}
//================================================================================================================================ //================================================================================================================================ inline double Point2D::x() const {return m_x;} inline double Point2D::y() const {return m_y;} inline void Point2D::setX(double xc){m_x = xc;} inline void Point2D::setY(double yc){m_y = yc;}
//================================================================================================================================ //================================================================================================================================ inline bool operator==(const Point2D &p1, const Point2D &p2){return p1.m_x == p2.m_x && p1.m_y == p2.m_y;} inline bool operator!=(const Point2D &p1, const Point2D &p2){return p1.m_x != p2.m_x || p1.m_y != p2.m_y;} inline const Point2D operator-(const Point2D &point){return Point2D(-point.m_x, -point.m_y);}
geometry.h#ifndef GEOMETRY_H #define GEOMETRY_H
#include "point2d.h" #include "geometry_global.h"
//================================================================================================================================ // Расстояние между точками A и B. //================================================================================================================================ double GEOMETRY_EXPORT distance(const Point2D &A, const Point2D &B);
//================================================================================================================================ // Площадь треугольника ABC. //================================================================================================================================ double GEOMETRY_EXPORT squareTriangle(const Point2D &A, const Point2D &B, const Point2D &C);
//================================================================================================================================ // Проверка, принадлежит ли точка Z треугольнику ABC. //================================================================================================================================ bool GEOMETRY_EXPORT pointInsideTriangle(const Point2D &A, const Point2D &B, const Point2D &C, const Point2D &Z);
#endif // GEOMETRY_H
geometry.cpp#include <math.h> #include <float.h> #include "geometry.h"
//================================================================================================================================ // Расстояние между точками A и B. //================================================================================================================================ inline double GEOMETRY_EXPORT distance(const Point2D &A, const Point2D &B) { return sqrt((A.x() - B.x())*(A.x() - B.x()) + (A.y() - B.y())*(A.y() - B.y())); }
//================================================================================================================================ // Площадь треугольника ABC. //================================================================================================================================ inline double GEOMETRY_EXPORT squareTriangle(const Point2D &A, const Point2D &B, const Point2D &C) { return qAbs((B.x() - A.x())*(C.y() - A.y()) - (C.x() - A.x())*(B.y() - A.y()))/2.; }
//================================================================================================================================ // Проверка, принадлежит ли точка Z треугольнику ABC. //================================================================================================================================ bool GEOMETRY_EXPORT pointInsideTriangle(const Point2D &A, const Point2D &B, const Point2D &C, const Point2D &Z) { double s = squareTriangle(A, B, C); double s1 = squareTriangle(Z, B, C); double s2 = squareTriangle(A, Z, C); double s3 = squareTriangle(A, B, Z);
if(qAbs(s - s1 - s2 - s3) < DBL_EPSILON) return true; else return false; }
При компиляции вываливается следующая ошибка: release/geometry.o:geometry.cpp:(.text$_Z14squareTriangleRK7Point2DS1_S1_[squareTriangle(Point2D const&, Point2D const&, Point2D const&)]+0x16): undefined reference to `Point2D::x() const' release/geometry.o:geometry.cpp:(.text$_Z14squareTriangleRK7Point2DS1_S1_[squareTriangle(Point2D const&, Point2D const&, Point2D const&)]+0x21): undefined reference to `Point2D::x() const' release/geometry.o:geometry.cpp:(.text$_Z14squareTriangleRK7Point2DS1_S1_[squareTriangle(Point2D const&, Point2D const&, Point2D const&)]+0x2c): undefined reference to `Point2D::y() const' release/geometry.o:geometry.cpp:(.text$_Z14squareTriangleRK7Point2DS1_S1_[squareTriangle(Point2D const&, Point2D const&, Point2D const&)]+0x37): undefined reference to `Point2D::y() const' release/geometry.o:geometry.cpp:(.text$_Z14squareTriangleRK7Point2DS1_S1_[squareTriangle(Point2D const&, Point2D const&, Point2D const&)]+0x42): undefined reference to `Point2D::x() const' release/geometry.o:geometry.cpp:(.text$_Z14squareTriangleRK7Point2DS1_S1_[squareTriangle(Point2D const&, Point2D const&, Point2D const&)]+0x4d): undefined reference to `Point2D::x() const' release/geometry.o:geometry.cpp:(.text$_Z14squareTriangleRK7Point2DS1_S1_[squareTriangle(Point2D const&, Point2D const&, Point2D const&)]+0x58): undefined reference to `Point2D::y() const' release/geometry.o:geometry.cpp:(.text$_Z14squareTriangleRK7Point2DS1_S1_[squareTriangle(Point2D const&, Point2D const&, Point2D const&)]+0x63): undefined reference to `Point2D::y() const' collect2: ld returned 1 exit status Есть подозрение, что проблема где-то в const. Но где - я не понимаю, а просто удалять все const не хочется. Помогите, пожалуйста, разобраться.
Название: Re: Undefined reference для функции определенной ВНУТРИ проекта.
Отправлено: Kolobok от Июня 26, 2010, 16:00
Перенеси определение inline методов в header.
Название: Re: Undefined reference для функции определенной ВНУТРИ проекта.
Отправлено: Blackwanderer от Июня 26, 2010, 16:20
Спасибо! Помогло! Сам бы никогда не догадался, в какую сторону копать.
А это стандарт такой или особенность компилятора?
Название: Re: Undefined reference для функции определенной ВНУТРИ проекта.
Отправлено: Sancho_s_rancho от Июня 26, 2010, 17:28
Спасибо! Помогло! Сам бы никогда не догадался, в какую сторону копать.
А это стандарт такой или особенность компилятора?
Если коротко, то это дерьмо. Для инлайнов и шаблонов declaration и definition должны быть в одной единице. пи.си. Стандарт ISO в этом месте не читал, но то, что так ведут себя все знакомые мне реализации подсказывает, что стандарт это одобрямс. Для шаблонов есть красивое ключевое слово export, но из-за трудностей в реализации его почти никто не поддерживает.
Название: Re: Undefined reference для функции определенной ВНУТРИ проекта.
Отправлено: Alex Custov от Июня 27, 2010, 23:51
А это стандарт такой или особенность компилятора?
стандарт такой. А как по-другому?
|