@PrizmMARgh

Как правильно делать релиз sfml-проектов?

Когда отправляю исполняемый файл с программой на sfml другому человеку, то у него терминал выдаёт ошибку, которая заключается в том, что не найдены динамические библиотеки. Как можно через cmake (пользуюсь clion) настроить проект так, чтобы библиотеки подключались статически? Видел решения, в которых люди заставляют программу при запуске установить через консоль отдельно sfml, если его нет, а потом уже запускать программу, но мне кажется, что это неправильное решение.
main.cpp
#include <SFML/Graphics.hpp>
#include <cstdint>

sf::Vector2i rotateRight(sf::Vector2i v) {
    return sf::Vector2i(v.y, -v.x);
}

sf::Vector2i rotateLeft(sf::Vector2i v) {
    return sf::Vector2i(-v.y, v.x);
}

class antField {
public:
    uint32_t W, H;
    sf::Vector2i antPos, antDir;
    uint8_t *cells;

    antField(uint32_t W_, uint32_t H_) {
        W = W_;
        H = H_;
        antPos = sf::Vector2i(W / 2, H / 2);
        antDir = sf::Vector2i(1, 0);
        cells = new uint8_t[W * H];
    }

    ~antField() {
        delete[] cells;
    }

    void step(sf::Image *img) {
        uint32_t *map = (uint32_t *) (img->getPixelsPtr());
        uint32_t i = antPos.x + W * antPos.y;
        uint8_t c = cells[i];
        bool angle = c != 2;

        map[i] = c == 0 ? 0xff0013FF :
                 c == 1 ? 0xff9C8903 :
                          0xff00EC95;
        antDir = angle ? rotateLeft(antDir) : rotateRight(antDir);
        cells[i] = (c + 1) % 3;
        antPos += antDir;
        (antPos.x += W) %= W;
        (antPos.y += H) %= H;
    }
};

int main() {
    sf::ContextSettings setting;
    setting.antialiasingLevel = 8;

    const uint16_t winW = 800, winH = 800;

    antField mainField(winW, winH);
    sf::Image img;
    img.create(winW, winH);
    sf::Texture tex;
    tex.create(winW, winH);
    sf::Sprite spr(tex);

    sf::RenderWindow window(sf::VideoMode(winW, winH), "ant", sf::Style::Default, setting);

    while (window.isOpen()) {
        sf::Event event;

        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed)
                window.close();
        }
        for (uint32_t i = 0; i < 1000; i++) {
            mainField.step(&img);
        }

        tex.loadFromImage(img);
        window.clear();
        window.draw(spr);
        window.display();
    }

    return 0;
}
CMakeList.txt
cmake_minimum_required(VERSION 3.10)
project(langtonAnt)

set(CMAKE_CXX_STANDARD 17)
set(SFML_DIR "C:/SFML-2.5.1")
find_package(SFML COMPONENTS graphics window system)
add_executable(langtonAnt main.cpp )
target_link_libraries(langtonAnt sfml-graphics sfml-audio)
  • Вопрос задан
  • 207 просмотров
Решения вопроса 1
@PrizmMARgh Автор вопроса
1. нужно скачать исходники sfml с их гитхаба.
2. с помощью cmake скомпилировать так, чтобы были статические библиотеки. По ходу будут возникать ошибки вида "нет библиотеки XXX" - нужно будет докачивать пакет libXXX-dev.
3. осле компиляции в файл cmake надо будет дописать:

set(SFML_DIR "путь к скомпилированному sfml/SFML-compiled")
set(CMAKE_MODULE_PATH "путь к скомпилированному sfml/SFML-compiled" ${CMAKE_MODULE_PATH})
set(SFML_STATIC_LIBRARIES TRUE)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
LoliDeveloper
@LoliDeveloper
Линейная алгебра как смысл жизни
Почитай туториалы на их оф сайте для своего компилятора. Там отдельные dll для статических библиотек
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы