如何使用自定义头文件构建程序,两者都使用SFML库?

How to build program using custom header files, both using SFML library?

提问人:Code Hard 提问时间:10/16/2023 更新时间:10/16/2023 访问量:45

问:

因此,我尝试创建一个自定义头文件,其中包含我对几个图形函数(如 drawPixel、drawLine 等)的实现。我的源文件(带main功能)和头文件都包含SFML库。当我在源文件中使用 sfml 函数时,它运行没有错误,但是当我在头文件中使用相同的函数时,它显示“链接器命令失败”。

sfml.cpp(源文件)

#include<SFML/Graphics.hpp>
#include "my_graphics.h"
int main()
{

sf::RenderWindow window(sf::VideoMode(500, 500), "SFML works!");

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


    // Clear the window
    window.clear();
    
    putPixel(window,100,100);
    window.display();

}
return 0;

}

my_graohics.h

#ifndef MY_GRAPHICS_H
#define MY_GRAPHICS_H
#include <SFML/Graphics.hpp>

void putPixel(sf::RenderTarget& target, int x, int y);

#endif

my_graphics.cpp

#include "my_graphics.h"
void putPixel(sf::RenderTarget& target, int x, int y) {
sf::Vertex vertex;
vertex.position = sf::Vector2f(x, y);
vertex.color = sf::Color::White;

sf::VertexArray point(sf::Points, 1);
point[0] = vertex;

target.draw(point);
}

build 命令

clang++ -std=gnu++14 -std=c++17 -fcolor-diagnostics -fansi-escape-codes -g sfml.cpp 
-o sfml -I /opt/homebrew/Cellar/sfml/2.6.0/include -L 
/opt/homebrew/Cellar/sfml/2.6.0/lib -lsfml-graphics -lsfml-window -lsfml-system
C++ 链接器错误 SFML 头文件

评论

2赞 Some programmer dude 10/16/2023
询问有关生成错误的问题时,请始终将完整和完整的生成日志复制粘贴到问题本身中。
1赞 Some programmer dude 10/16/2023
虽然很容易猜到这里的问题,因为你不是用你的源文件来构建的。my_graphics.cpp
0赞 Code Hard 10/16/2023
@Someprogrammerdude感谢您的提示,以前我试图分别编译这两个文件,然后将库链接到它们,它不起作用,当我将它们与库一起编译时,它成功构建了。谢谢!!
0赞 Some programmer dude 10/16/2023
如果要单独生成(对于较大的项目确实需要这样做),请使用创建对象文件的选项,然后将这些对象文件与库链接以创建可执行程序。我建议你要么开始使用 IDE,要么学习构建工具,比如 CMake,或者高级工具。它将帮助您处理具有多个源文件的大型项目。-cmake

答:

0赞 Code Hard 10/16/2023 #1

而不是单独编译文件“sfml.cpp”和“my_graphics.cpp”,并链接到每个文件的库。 我将它们编译在一起,并链接了这些库。

命令:

clang++ -std=gnu++14 -std=c++17 -fcolor-diagnostics -fansi-escape-codes -g sfml.cpp my_graphics.cpp -o program -I /opt/homebrew/Cellar/sfml/2.6.0/include -L /opt/homebrew/Cellar/sfml/2.6.0/lib -lsfml-graphics -lsfml-window -lsfml-system

评论

2赞 digito_evo 10/16/2023
在同一个生成命令中使用两者背后的原因是什么?我认为这没有任何意义。-std=gnu++14-std=c++17