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

向Chromium源码添加自定义类遇链接错误:未定义符号问题求助

Chromium Release模式下静态类符号未定义链接错误解决

问题背景

在ungoogled-chromium项目中,为统一管理分散在多文件的参数,我在src/base目录下实现了静态类GlobVars,用于从配置文件加载并更新参数。该实现在小型测试项目中正常,但在Chromium的Release非组件模式编译时,出现静态类成员函数未定义的链接错误。

相关代码

variables.h

#ifndef VARIABLES_H
#define VARIABLES_H

namespace base {
    class GlobVars {
        public:
            static void updateVars();
            static int getDevMem();
        private:
            // config vars
            static int device_memory;
            static double battery_percentage;
            //static std::string user_agent, platform;
    };

} // namespace base

#endif

variables.cc

#include "variables.h"

namespace base {
    int GlobVars::device_memory = 0;
    double GlobVars::battery_percentage = 0;
    //std::string GlobVars::user_agent = "", GlobVars::platform = "";

    void GlobVars::updateVars() {
        device_memory = 456;
        battery_percentage = 0.768;
    }

    int GlobVars::getDevMem(){
        return device_memory;
    }
} // namespace base

调用代码(approximated_device_memory.cc)

#include "third_party/blink/public/common/device_memory/approximated_device_memory.h"

#include "base/check_op.h"
#include "base/system/sys_info.h"
#include "base/variables.h"

namespace blink {
    // static
    float ApproximatedDeviceMemory::approximated_device_memory_gb_ = 0.0;
    int64_t ApproximatedDeviceMemory::physical_memory_mb_ = 0;
    
    // static
    float ApproximatedDeviceMemory::GetApproximatedDeviceMemory() {
      return ::base::GlobVars::getDevMem(); 
      //return approximated_device_memory_gb_;
    }
}  // namespace blink

链接错误信息

FAILED: chromedriver_unittests.exe chromedriver_unittests.exe.pdb

..\\..\\third_party\\llvm-build\\Release+Asserts\\bin\\lld-link.exe /OUT:./chromedriver_unittests.exe /nologo -libpath:..\\..\\third_party\\llvm-build\\Release+Asserts\\lib\\clang\\16.0.0\\lib\\windows "-libpath:../../../../../../../Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.33.31629/ATLMFC/lib/x64" "-libpath:../../../../../../../Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.33.31629/lib/x64" "-libpath:../../../../../../../Program Files (x86)/Windows Kits/NETFXSDK/4.8/lib/um/x64" "-libpath:../../../../../../../Program Files (x86)/Windows Kits/10/lib/10.0.20348.0/ucrt/x64" "-libpath:../../../../../../../Program Files (x86)/Windows Kits/10/lib/10.0.20348.0/um/x64" /MACHINE:X64  /PDB:./chromedriver_unittests.exe.pdb @./chromedriver_unittests.exe.rsp

lld-link: error: undefined symbol: public: static int __cdecl base::GlobVars::getDevMem(void)

\\\>>> referenced by ../../third_party/blink/common/device_memory/approximated_device_memory.cc

\\\>>>               obj/third_party/blink/common/common/approximated_device_memory.obj

[15619/17044] CXX obj/v8/torque_generated_definitions/js-objects-tq.obj

ninja: build stopped: subcommand failed.

解决方法

1. 配置Chromium构建系统的依赖

Chromium采用Ninja构建,非组件模式下模块为静态链接。需确保variables.cc被纳入base模块的构建目标,且调用它的blink模块依赖该目标:

  • 打开src/base/BUILD.gn,在对应source_set或static_library的sources列表中添加variables.cc:
    sources = [
      # ... 已有源文件
      "variables.cc",
    ]
    
  • 若blink模块未依赖包含GlobVars的base子目标,需在third_party/blink/common/BUILD.gn中添加对应的依赖项。

2. 修正符号可见性

Chromium Release模式默认启用符号隐藏,需为GlobVars类添加导出宏以确保跨模块可见:

  • 在variables.h开头引入Chromium的导出宏头文件:
    #include "base/base_export.h"
    
  • 为类添加BASE_EXPORT修饰:
    class BASE_EXPORT GlobVars {
        // ... 类成员
    };
    

3. 验证头文件路径与命名空间

确认#include "base/variables.h"路径正确,调用时使用::base::GlobVars::getDevMem()确保全局命名空间引用无歧义。

4. 重建构建文件与编译

修改配置后,重新生成Ninja构建文件并清理缓存编译:

gn gen out/Release --args="is_component_build=false is_debug=false"
ninja -C out/Release clean
ninja -C out/Release chromedriver_unittests

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:25:39