使用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
相关产品推荐
相关产品推荐

