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

编译时出现`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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:25:24