0

Пытаюсь написать графическое приложение с использованием библиотеки SFML C++, сборщик - CMake, ОС - Windows, компилятор - cl, версия SFML - 2.6.1

Сгенерировал кэш - всё хорошо, запускаю сборку через "cmake --build .", выдаёт ошибку:

main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: void __cdecl ArtObjects::NewArtO::L_draw(class sf::RectangleShape &,class sf::RenderWindow &)" (?L_draw@NewArtO@ArtObjects@@ QEAAXAEAVRectangleShape@sf@@AEAVRenderWindow@4@@Z) в функции main. [C:\Users\user\Programming\Cpp\testtitcuwn\LetterDraw\build\LetterDraw.vcxproj] C:\Users\user\Programming\Cpp\testtitcuwn\LetterDraw\build\Debug\LetterDraw.exe : fatal error LNK1120: неразрешенных внешних элементов: 1 [C:\Users\user\Programming\Cpp\testtitcuwn\LetterDraw\build
LetterDraw.vcxproj]

проблемная часть кода:

main.cpp:

l_letter.L_draw(rectangle, window);

ObjectsX.cpp:

void L_draw(sf::RectangleShape& rectangle, sf::RenderWindow& window){
    rectangle.setSize(size);
    rectangle.setFillColor(sf::Color::Black);
    rectangle.setPosition(xy_pos);
    window.draw(rectangle);

    rectangle.setPosition({ xOffsetRight(rectangle) });
    window.draw(rectangle);

    rectangle.setPosition({ yOffsetDown(rectangle) });
    window.draw(rectangle);

    rectangle.setPosition({ yOffsetDown(rectangle) });
    window.draw(rectangle); 

}

Полный исходный код:

ObjectsX.cpp:

#include "ObjectsX.hpp"
             //x y                //rect size x y,   //with(out) outline

ArtObjects::NewArtO::NewArtO(sf::Vector2f xy_pos, sf::Vector2f size, bool outline) : xy_pos(xy_pos), size(size), outline(outline) {

}

class NewArtO {

protected: sf::Vector2f xy_pos; sf::Vector2f size; bool outline;

public: void L_draw(sf::RectangleShape& rectangle, sf::RenderWindow& window){

    rectangle.setSize(size);
    rectangle.setFillColor(sf::Color::Black);
    rectangle.setPosition(xy_pos);
    window.draw(rectangle);

    rectangle.setPosition({ xOffsetRight(rectangle) });
    window.draw(rectangle);

    rectangle.setPosition({ yOffsetDown(rectangle) });
    window.draw(rectangle);

    rectangle.setPosition({ yOffsetDown(rectangle) });
    window.draw(rectangle);



}




};

ObjectsX.hpp:

#pragma once
#include <SFML/Graphics.hpp>
#include <vector>
//---------------------------------------------------
#define pos_x(object) ( object.getPosition().x )
#define pos_y(object) ( object.getPosition().y )
#define size_x(object) ( object.getSize().x )
#define size_y(object) ( object.getSize().y )

//number shift right along the abscissa axis #define xOffsetRight(object)
pos_x(object) + size_x(object)
,
pos_y(object) + 0
//number shift left along the abscissa axis #define xOffsetLeft(object)
pos_x(object) - size_x(object)
,
pos_y(object) + 0
//number shift up along the ordinate axis #define yOffsetUp(object)
pos_x(object) + 0
,
pos_y + size_y
//number shift down along the ordinate axis #define yOffsetDown(object)
pos_x(object) + 0
,
pos_y(object) - size_y(object)
//---------------------------------------------------

namespace ArtObjects { /*

  • ���� ����� ������ ����� :
  • ���������� ����������� ����� ����������� �������
  • ����� ����� ��������� ������������ ������������ ��������� � ���������� ��������� �������� ����� ������

*/ class NewArtO { //���������� ������� � ������������� public: NewArtO(sf::Vector2f xy_pos, sf::Vector2f size, bool outline); //����� ��������� ����� "L" void L_draw(sf::RectangleShape& rectangle, sf::RenderWindow& window); protected: sf::Vector2f xy_pos; sf::Vector2f size; bool outline; }; }

main.hpp:

#pragma once
#include <SFML/Graphics.hpp>
#include "ObjectsX.hpp"
#include <iostream>
#include <Windows.h>

main.cpp:

#include "main.hpp"

#if _DEBUG int main() { #else int WinMain() { #endif sf::RenderWindow window(sf::VideoMode(800, 700, 32U), "SFMLTutorial");

sf::RectangleShape rectangle;
ArtObjects::NewArtO l_letter(
    { 0.f,0.f }, 
    { 100.f, 100.f },
    false

);

while (window.isOpen())
{
    sf::Event event;
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed) {
            window.close();
        }
    }

    window.clear(sf::Color::White);

    l_letter.L_draw(rectangle, window);

    window.display();
}
return 0;

}

Искал в интернете эту ошибку, где-то видел, что нужно добавить символ "&", чтобы избежать лишних копирок. Как видно из исходного кода, который я прикрепил - добавил, а ошибка никуда не исчезла "void L_draw(sf::RectangleShape& rectangle, sf::RenderWindow& window){"

Arslan I.
  • 384
  • 2
  • 11
  • Удалил class NewArtO { т.к. он уже декларирован в заголовочном файле, добавил namespace::class к методу L_draw и всё заработало. – Arslan I. Feb 02 '24 at 10:19

0 Answers0