Russian Qt Forum
Января 18, 2025, 22:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Undefined reference для функции определенной ВНУТРИ проекта.  (Прочитано 2930 раз)
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 не хочется.
Помогите, пожалуйста, разобраться.
Записан
Kolobok
Гость
« Ответ #1 : Июня 26, 2010, 16:00 »

Перенеси определение inline методов в header.
Записан
Blackwanderer
Гость
« Ответ #2 : Июня 26, 2010, 16:20 »

Спасибо! Помогло!
Сам бы никогда не догадался, в какую сторону копать.

А это стандарт такой или особенность компилятора?
Записан
Sancho_s_rancho
Гость
« Ответ #3 : Июня 26, 2010, 17:28 »

Спасибо! Помогло!
Сам бы никогда не догадался, в какую сторону копать.

А это стандарт такой или особенность компилятора?
Если коротко, то это дерьмо. Для инлайнов и шаблонов declaration и definition должны быть в одной единице.
пи.си. Стандарт ISO в этом месте не читал, но то, что так ведут себя все знакомые мне реализации подсказывает, что стандарт это одобрямс. Для шаблонов есть красивое ключевое слово export, но из-за трудностей в реализации его почти никто не поддерживает.
« Последнее редактирование: Июня 26, 2010, 17:39 от Sancho_s_rancho » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Июня 27, 2010, 23:51 »

А это стандарт такой или особенность компилятора?

стандарт такой. А как по-другому?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.066 секунд. Запросов: 23.