无法使用 stb_image
Unable to use stb_image
我正在做一个项目,我试图加载一个图像,这样我就可以将它用作纹理,但是当我试图包含 stb_image 时,我 运行 遇到了问题.
我把 stb_image.h
放在 src/vendor/stb_image/
中,用
制作了一个名为 stb_image.cpp
的 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);
我曾尝试使用 stb_image 将 #define STB_IMAGE_IMPLEMENTATION
放入文件中,然后将其包含在内,但效果不佳。比以前好多了,但是当我尝试加载图像时,什么也没有发生。我用
打印了一些图像数据
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})
build.sh:
#!/bin/sh
cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug
ninja
我可以将所有代码放在 github 上,并在必要时将 link 发送到存储库。
包含 stb 方法 (src/vendor/stb_image/stb_image.cpp
) 实现的文件不是编译的一部分,这可以通过检查构建命令中提到的 cpp 文件看出。
这是因为cmake文件设置了只编译src文件夹下的文件,不编译src/vendor/stb_image/
文件夹下的文件。您必须添加这些文件才能将库的实现添加到您的项目中。
我正在做一个项目,我试图加载一个图像,这样我就可以将它用作纹理,但是当我试图包含 stb_image 时,我 运行 遇到了问题.
我把 stb_image.h
放在 src/vendor/stb_image/
中,用
stb_image.cpp
的 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);
我曾尝试使用 stb_image 将 #define STB_IMAGE_IMPLEMENTATION
放入文件中,然后将其包含在内,但效果不佳。比以前好多了,但是当我尝试加载图像时,什么也没有发生。我用
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})
build.sh:
#!/bin/sh
cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug
ninja
我可以将所有代码放在 github 上,并在必要时将 link 发送到存储库。
包含 stb 方法 (src/vendor/stb_image/stb_image.cpp
) 实现的文件不是编译的一部分,这可以通过检查构建命令中提到的 cpp 文件看出。
这是因为cmake文件设置了只编译src文件夹下的文件,不编译src/vendor/stb_image/
文件夹下的文件。您必须添加这些文件才能将库的实现添加到您的项目中。