Пытаюсь написать графическое приложение с использованием библиотеки 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){"