我正在制作一个 C++ 项目以获取乐趣。然而我被这个错误难住了。 我的 cmake 文件构建良好,但尝试运行会出现错误:
undefined reference to
IMG_Load'`。
我使用的是 Arch Linux,并且我已经从源代码安装了 SDL2,并从源代码安装了 SDL_Image。所以我很确定所有需要的内容都已到位。
我的 CMake 文件:
CMAKE_MINIMUM_REQUIRED(VERSION 3.27.4)
project(Origin)
find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
set(
SOURCES
src/main.cpp
src/game.cpp
)
add_executable(Origin ${SOURCES})
include_directories(
Origin
${SDL2_IMAGE_INCLUDE_DIRS}
${SDL2_INCLUDE_DIRS}
headers/
)
target_link_libraries(
Origin
${SDL2_IMAGE_LIBRARIES}
${SDL2_LIBRARIES}
)
这显示没有错误,并且通过 VSCode 运行
build
,工作正常。尝试 run
之后显示未定义的错误。
我确信我做错了什么,但我不知道是什么。我真的很感激任何帮助。 谢谢!
我尝试过的事情:
我尝试仔细检查 SDL 库变量的名称,并确保找到它们。据我所知,他们被发现了。
我已经按照我认为最好的顺序重新排列了我的 cmake 文件,这样 cmake 就不会尝试以不正确的顺序执行操作。
我搜索了谷歌,只发现这是一个链接错误,这就是为什么我在这里问我的问题。
我删除了 IMG_Load 函数以确保我的项目构建并运行。确实如此,没有错误。
看起来您已经为 SDL2 和 SDL2_image 正确设置了 CMakeLists.txt 文件。但是,“未定义对 IMG_Load 的引用”错误通常表示存在链接问题。要解决此问题,您需要确保 SDL2_image 库已正确链接。以下是帮助您调试和解决问题的几个步骤:
检查库名称: 首先,确保您链接到正确的 SDL2_image 库。 SDL2_image 的库名称可能会有所不同,具体取决于您的系统及其安装方式。尝试像这样更改您的 target_link_libraries 部分:
target_link_libraries(Origin PRIVATE SDL2::SDL2 SDL2::SDL2_image)
这假设您已将 SDL2 和 SDL2_image 作为 CMake 包安装。 “::”符号用于查找并链接正确的库。
验证安装: 仔细检查您是否已正确安装 SDL2_image。您提到您是从源代码安装的。确保您已成功编译并安装它,并且它位于 CMake 可以找到它的位置。确保 SDL2_image 库存在且可访问。
CMake 缓存: 有时 CMake 缓存可能会导致问题。尝试删除 CMake 缓存并重建项目:
rm -rf CMakeFiles CMakeCache.txt
cmake .
完全重建: 有时,完全重建可以解决链接问题。尝试跑步:
make clean
make
CMakeLists.txt 命令: 确保您的 CMakeLists.txt 文件与源文件位于同一目录中,并且 CMake 正确拾取该文件。项目目录中 CMakeLists.txt 和源文件的顺序有时会影响构建过程。
编译器标志: 检查您是否使用了正确的编译器标志。确保您没有无意中覆盖 CMakeLists.txt 或构建环境中的必要标志。
库路径: 验证系统中 SDL2 和 SDL2_image 的库路径设置是否正确。您可能需要更新 LD_LIBRARY_PATH 环境变量或将库路径添加到 CMakeLists.txt(如果它们不在标准搜索路径中)。
IDE 特定问题: 如果您使用的是 Visual Studio Code 等 IDE,有时特定于 IDE 的配置可能会导致问题。确保您的 IDE 配置为使用正确的 CMakeLists.txt 文件和构建设置。
尝试这些步骤后,重建您的项目,“对 IMG_Load 的未定义引用”错误应该得到解决。如果您仍然遇到问题,请提供有关您的系统以及如何安装 SDL2 和 SDL2_image 的更多详细信息,这可以帮助进一步诊断问题。