You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CMake链接RayLib时出现未定义引用问题求助

解决CMake链接RayLib时的未定义引用错误

编译运行时出现以下链接错误:

/usr/bin/ld: /home/doppler/C++ Projects/test 2/source/main.cpp:15: undefined reference to `SetTargetFPS'

项目创建流程

  • 创建目录结构:test2、external、source
  • 使用VS Code的CMake快速启动功能初始化项目
  • 将RayLib克隆到external目录
  • 编辑根目录的CMake配置文件如下:
cmake_minimum_required(VERSION 3.30.0)
project(test2 VERSION 0.1.0 LANGUAGES C CXX)

set(MAIN_PATH source/main.cpp)

add_executable(${PROJECT_NAME} ${MAIN_PATH})

add_subdirectory(external/raylib)
include_directories("external" "external/raylib/src")
target_link_libraries(${PROJECT_NAME} PRIVATE raylib)

编译步骤

在项目主目录执行以下命令编译:

mkdir build
cd build 
cmake --build .

执行cmake --build . --verbose的完整输出:

doppler@doppler-Dell-G15-5510:~/C++ Projects/test 2/build$ cmake --build . --verbose
Change Dir: '/home/doppler/C++ Projects/test 2/build'

Run Build Command(s): /home/doppler/.local/lib/python3.10/site-packages/cmake/data/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile
/home/doppler/.local/lib/python3.10/site-packages/cmake/data/bin/cmake -S"/home/doppler/C++ Projects/test 2" -B"/home/doppler/C++ Projects/test 2/build" --check-build-system CMakeFiles/Makefile.cmake 0
/home/doppler/.local/lib/python3.10/site-packages/cmake/data/bin/cmake -E cmake_progress_start "/home/doppler/C++ Projects/test 2/build/CMakeFiles" "/home/doppler/C++ Projects/test 2/build//CMakeFiles/progress.marks"
/usr/bin/gmake  -f CMakeFiles/Makefile2 all
gmake[1]: Entering directory '/home/doppler/C++ Projects/test 2/build'
/usr/bin/gmake  -f external/raylib/raylib/external/glfw/src/CMakeFiles/glfw.dir/build.make external/raylib/raylib/external/glfw/src/CMakeFiles/glfw.dir/depend
gmake[2]: Entering directory '/home/doppler/C++ Projects/test 2/build'
cd "/home/doppler/C++ Projects/test 2/build" && /home/doppler/.local/lib/python3.10/site-packages/cmake/data/bin/cmake -E cmake_depends "Unix Makefiles" "/home/doppler/C++ Projects/test 2" "/home/doppler/C++ Projects/test 2/external/raylib/src/external/glfw/src" "/home/doppler/C++ Projects/test 2/build" "/home/doppler/C++ Projects/test 2/build/external/raylib/raylib/external/glfw/src" "/home/doppler/C++ Projects/test 2/build/external/raylib/raylib/external/glfw/src/CMakeFiles/glfw.dir/DependInfo.cmake" "--color="
gmake[2]: Leaving directory '/home/doppler/C++ Projects/test 2/build'
/usr/bin/gmake  -f external/raylib/raylib/external/glfw/src/CMakeFiles/glfw.dir/build.make external/raylib/raylib/external/glfw/src/CMakeFiles/glfw.dir/build
gmake[2]: Entering directory '/home/doppler/C++ Projects/test 2/build'
gmake[2]: Nothing to be done for 'external/raylib/raylib/external/glfw/src/CMakeFiles/glfw.dir/build'.
gmake[2]: Leaving directory '/home/doppler/C++ Projects/test 2/build'
[ 81%] Built target glfw
/usr/bin/gmake  -f external/raylib/raylib/CMakeFiles/raylib.dir/build.make external/raylib/raylib/CMakeFiles/raylib.dir/depend
gmake[2]: Entering directory '/home/doppler/C++ Projects/test 2/build'
cd "/home/doppler/C++ Projects/test 2/build" && /home/doppler/.local/lib/python3.10/site-packages/cmake/data/bin/cmake -E cmake_depends "Unix Makefiles" "/home/doppler/C++ Projects/test 2" "/home/doppler/C++ Projects/test 2/external/raylib/src" "/home/doppler/C++ Projects/test 2/build" "/home/doppler/C++ Projects/test 2/build/external/raylib/raylib" "/home/doppler/C++ Projects/test 2/build/external/raylib/raylib/CMakeFiles/raylib.dir/DependInfo.cmake" "--color="
gmake[2]: Leaving directory '/home/doppler/C++ Projects/test 2/build'
/usr/bin/gmake  -f external/raylib/raylib/CMakeFiles/raylib.dir/build.make external/raylib/raylib/CMakeFiles/raylib.dir/build
gmake[2]: Entering directory '/home/doppler/C++ Projects/test 2/build'
gmake[2]: Nothing to be done for 'external/raylib/raylib/CMakeFiles/raylib.dir/build'.
gmake[2]: Leaving directory '/home/doppler/C++ Projects/test 2/build'
[ 96%] Built target raylib
/usr/bin/gmake  -f CMakeFiles/test2.dir/build.make CMakeFiles/test2.dir/depend
gmake[2]: Entering directory '/home/doppler/C++ Projects/test 2/build'
cd "/home/doppler/C++ Projects/test 2/build" && /home/doppler/.local/lib/python3.10/site-packages/cmake/data/bin/cmake -E cmake_depends "Unix Makefiles" "/home/doppler/C++ Projects/test 2" "/home/doppler/C++ Projects/test 2" "/home/doppler/C++ Projects/test 2/build" "/home/doppler/C++ Projects/test 2/build" "/home/doppler/C++ Projects/test 2/build/CMakeFiles/test2.dir/DependInfo.cmake" "--color="
gmake[2]: Leaving directory '/home/doppler/C++ Projects/test 2/build'
/usr/bin/gmake  -f CMakeFiles/test2.dir/build.make CMakeFiles/test2.dir/build
gmake[2]: Entering directory '/home/doppler/C++ Projects/test 2/build'
[ 98%] Building CXX object CMakeFiles/test2.dir/source/main.cpp.o
/usr/bin/c++ -DGRAPHICS_API_OPENGL_33 -DPLATFORM_DESKTOP -I"/home/doppler/C++ Projects/test 2/external" -I"/home/doppler/C++ Projects/test 2/external/raylib/src" -I"/home/doppler/C++ Projects/test 2/external/raylib/src/external/glfw/include" -g -MD -MT CMakeFiles/test2.dir/source/main.cpp.o -MF CMakeFiles/test2.dir/source/main.cpp.o.d -o CMakeFiles/test2.dir/source/main.cpp.o -c "/home/doppler/C++ Projects/test 2/source/main.cpp"
[100%] Linking CXX executable test2
/home/doppler/.local/lib/python3.10/site-packages/cmake/data/bin/cmake -E cmake_link_script CMakeFiles/test2.dir/link.txt --verbose=1
/usr/bin/c++ -g CMakeFiles/test2.dir/source/main.cpp.o -o test2  external/raylib/raylib/libraylib.a -lm -lpthread /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/lib/x86_64-linux-gnu/librt.a -lm -ldl
gmake[2]: Leaving directory '/home/doppler/C++ Projects/test 2/build'
[100%] Built target test2
gmake[1]: Leaving directory '/home/doppler/C++ Projects/test 2/build'
/home/doppler/.local/lib/python3.10/site-packages/cmake/data/bin/cmake -E cmake_progress_start "/home/doppler/C++ Projects/test 2/build/CMakeFiles" 0

解决方案

这个错误的核心原因是RayLib是C语言编写的库,而你的项目是C项目,C编译器会对函数名进行名称修饰(name mangling),导致链接器无法匹配C语言编译的RayLib函数符号。

方法1:在C++代码中用extern "C"包裹RayLib头文件

修改main.cpp中引用RayLib的部分:

extern "C" {
#include "raylib.h"
}

int main() {
    SetTargetFPS(60);
    // 其他业务代码
    return 0;
}

方法2:在CMake中为RayLib头文件添加C语言编译属性

如果不想修改代码,可在CMake配置中为RayLib头文件目录设置C语言属性,让编译器以C语言规则处理这些头文件:
修改CMakeLists.txt,替换原include_directories配置:

cmake_minimum_required(VERSION 3.30.0)
project(test2 VERSION 0.1.0 LANGUAGES C CXX)

set(MAIN_PATH source/main.cpp)

add_executable(${PROJECT_NAME} ${MAIN_PATH})

add_subdirectory(external/raylib)
# 使用target_include_directories替代全局include_directories
target_include_directories(${PROJECT_NAME} PRIVATE
    "external"
    ${CMAKE_CURRENT_SOURCE_DIR}/external/raylib/src
)
# 为RayLib头文件目录设置C语言编译属性
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/external/raylib/src PROPERTY INCLUDE_DIRECTORIES_PROPERTIES C)

target_link_libraries(${PROJECT_NAME} PRIVATE raylib)

验证修复

修改后,删除原build目录重新编译:

rm -rf build
mkdir build && cd build
cmake --build .

运行程序即可正常链接RayLib函数。

内容的提问来源于stack exchange,提问作者Doppler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 03:04:50