编译时出现`REngine::mEngine`未定义引用错误求助
编译C++项目时
REngine::mEngine未定义引用错误排查与解决 错误现象
链接器报错信息如下:
/usr/bin/ld: src/engine/libengine.a(rengine.cpp.o): warning: relocation against `_ZN8REngine7mEngineE' in read-only section `.text' /usr/bin/ld: CMakeFiles/sdlgame.dir/src/main.cpp.o: in function `REngine::engine()': /media/hd/sdlgame/src/engine/rengine.h:27: undefined reference to `REngine::mEngine' /usr/bin/ld: src/engine/libengine.a(rengine.cpp.o): in function `REngine::REngine()': /media/hd/sdlgame/src/engine/rengine.cpp:8: undefined reference to `REngine::mEngine' /usr/bin/ld: warning: creating DT_TEXTREL in a PIE collect2: error: ld returned 1 exit status gmake[3]: *** [CMakeFiles/sdlgame.dir/build.make:99: sdlgame] Error 1 gmake[2]: *** [CMakeFiles/Makefile2:119: CMakeFiles/sdlgame.dir/all] Error 2 gmake[1]: *** [CMakeFiles/Makefile2:126: CMakeFiles/sdlgame.dir/rule] Error 2 gmake: *** [Makefile:124: sdlgame] Error 2
相关代码
main函数代码
#include "engine/rengine.h" #include <stdio.h> #include <string> #include <fstream> int main( int argc, char* args[] ) { auto engine = REngine::engine(); return 0; }
REngine类定义
#include <SDL2/SDL.h> class REngine { public: REngine() {} ~REngine() {} inline static REngine* engine() { return mEngine = mEngine ? mEngine : new REngine; } private: static REngine* mEngine; };
项目结构
sdlgame/ CMakeLists.txt src/ main.cpp engine/ CMakeLists.txt engine.cpp engine.h
CMake配置
根目录CMakeLists.txt
CMake_Minimum_Required (VERSION 3.1) project (sdlgame VERSION 0.1.0) find_package(SDL2 REQUIRED) find_package(SDL2_image REQUIRED) find_package(SDL2_ttf REQUIRED) find_package(SDL2_mixer REQUIRED) include_directories(${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS} ${SDL2_TTF_INCLUDE_DIRS} ${SDL2_MIXER_INCLUDE_DIRS}) add_subdirectory(src/engine) add_executable(${PROJECT_NAME} src/main.cpp) target_link_libraries(${PROJECT_NAME} PUBLIC engine ${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES} ${SDL2_TTF_LIBRARIES} ${SDL2_MIXER_LIBRARIES})
engine目录CMakeLists.txt
file( GLOB engine_SOURCES *.cpp ) add_library( engine ${engine_SOURCES} ) target_include_directories(engine PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
问题原因
- 静态成员变量未定义:C++中类内仅声明的静态成员变量,必须在类外单独定义以分配内存,否则链接阶段无法找到对应的符号。当前仅在
REngine类中声明了static REngine* mEngine;,未在.cpp文件中完成定义。 - 文件命名与编译范围不匹配:报错信息中出现
rengine.cpp.o,但项目结构显示engine目录下为engine.cpp,存在文件名不一致的问题,可能导致静态成员的定义未被编译进库文件。
解决办法
- 定义静态成员变量:在
rengine.cpp(类的实现文件)中添加静态成员的定义,放在类外部:
REngine* REngine::mEngine = nullptr;
- 修正文件与编译配置:确认engine目录下的源文件命名为
rengine.cpp,或调整CMakeLists.txt显式指定源文件(推荐显式方式避免GLOB遗漏):
修改engine目录的CMakeLists.txt为:
add_library(engine rengine.cpp) target_include_directories(engine PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
- 清理重建项目:清理CMake缓存后重新构建,避免旧编译信息干扰:
cd sdlgame rm -rf build mkdir build && cd build cmake .. make
内容的提问来源于stack exchange,提问作者Shizo
相关产品推荐
相关产品推荐

