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

