0

我正在做一个项目,我试图加载一个图像,以便我可以将它用作纹理,但是当我尝试包含 stb_image 时遇到了一个问题。

我放入stb_image.hsrc/vendor/stb_image/制作了一个名为的cppstb_image.cpp文件

#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"

在文件中,并将文件放在 src/vendor/stb_image/目录中。当我尝试包含#include "vendor/stb_image/stb_image.h"并使用它时,我收到此错误:

: && /usr/bin/c++  -Wall -Werror -std=c++14 -g   CMakeFiles/opengl-learning.dir/src/Debug.cpp.o CMakeFiles/opengl-learning.dir/src/IndexBuffer.cpp.o CMakeFiles/opengl-learning.dir/src/Renderer.cpp.o CMakeFiles/opengl-learning.dir/src/Shader.cpp.o CMakeFiles/opengl-learning.dir/src/Texture.cpp.o CMakeFiles/opengl-learning.dir/src/VertexArray.cpp.o CMakeFiles/opengl-learning.dir/src/VertexBuffer.cpp.o CMakeFiles/opengl-learning.dir/src/main.cpp.o  -o opengl-learning  -lglfw /usr/lib64/libGLEW.so /usr/lib/x86_64-linux-gnu/libOpenGL.so /usr/lib/x86_64-linux-gnu/libGLX.so /usr/lib/x86_64-linux-gnu/libGLU.so && :
/usr/bin/ld: CMakeFiles/opengl-learning.dir/src/Texture.cpp.o: in function `Texture::Texture(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
/home/user/Documents/CPP-Stuff/OpenGL-Learning/src/Texture.cpp:5: undefined reference to `stbi_set_flip_vertically_on_load'
/usr/bin/ld: /home/user/Documents/CPP-Stuff/OpenGL-Learning/src/Texture.cpp:6: undefined reference to `stbi_load'
/usr/bin/ld: /home/user/Documents/CPP-Stuff/OpenGL-Learning/src/Texture.cpp:23: undefined reference to `stbi_image_free'
collect2: error: ld returned 1 exit status

这是我试图运行的代码,它使用了 stb_image:

stbi_set_flip_vertically_on_load(1);                                        
m_LocalBuffer = stbi_load(path.c_str(), &m_Width, &m_Height, &m_BPP, 4);  

我尝试#define STB_IMAGE_IMPLEMENTATION使用 stb_image 放入文件,然后将其包含在内,但效果不佳。比以前好多了,但是当我尝试加载图像时,什么也没发生。我打印了一些图像数据

stbi_set_flip_vertically_on_load(1);                                        
m_LocalBuffer = stbi_load(path.c_str(), &m_Width, &m_Height, &m_BPP, 4);    
                                                              
std::cout << "m_BPP: " << m_BPP << " m_Width: " << m_Width << " m_Height: " << m_Height << std::endl;

它打印m_BPP: 0 m_Width: 0 m_Height: 0(默认值,意味着它没有加载任何东西)。m_LocalBuffer 也是空的。我没有任何 opengl 错误或编译器错误,所以我不知道我做错了什么。我正在使用 cmake 和 ninja 来构建,如果有帮助的话。我用来构建的 cmake 文件和 build.sh 文件将包含在下面。

CMakeLists:

cmake_minimum_required (VERSION 3.5)

if(POLICY CMP0072)
    cmake_policy(SET CMP0072 NEW)
else(NOT POLICY CMP0072)
    message(STATUS "Error")
endif(POLICY CMP0072)

project (opengl-learning)

find_package(PkgConfig REQUIRED)
pkg_search_module(GLFW REQUIRED glfw3)
include_directories(${GLFW_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIR})

set (GCC_COVERAGE_LINK_FLAGS "-lglfw3 -pthread -ldl -lGLU -lGL -lrt -lXrandr -lXxf86vm -lXi -lXinerama -lX11 -lGLEW -lGLU -lGL")

add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -std=c++14")
set (source_dir "${PROJECT_SOURCE_DIR}/src/")

file (GLOB source_files "${source_dir}/*.cpp")

add_executable (opengl-learning ${source_files})

find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)

target_link_libraries(opengl-learning ${GLFW_LIBRARIES} ${GLEW_LIBRARIES} ${OPENGL_LIBRARIES})

构建.sh:

#!/bin/sh

cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug
ninja

我可以将所有代码放在 github 上,并在必要时发送指向 repo 的链接。

4

1 回答 1

0

包含 stb 方法src/vendor/stb_image/stb_image.cpp

原因是cmake文件设置为只编译src文件夹中的文件,不编译文件夹中的src/vendor/stb_image/文件。您必须添加这些文件才能将库的实现放入您的项目中。

于 2021-04-24T17:43:50.517 回答