如何在 chromium 源代码中添加一个新类?链接器不会看到带有新类的新标头和 .cc 文件

How to add a new class to the chromium source code? Linker won't see the new header and .cc files with the new class

提问人:minok 提问时间:11/9/2022 更新时间:7/17/2023 访问量:195

问:

我正在做一个处理 ungoogled-chromium 的项目。我的部分任务是更改分布在多个头文件中的一些参数。这个想法是有一个自定义类,该类将从配置文件加载数据,将其保存到自定义类中的变量中,然后更新不同类中所需的参数。

附加信息:

- 我正在以发布模式构建 Chromium,而不是组件。

-我的想法是把这个类放在 src/base 中,因为我想在其他类中重用它,我认为它应该放在较低级别的某个地方。

-我不是C++最好的

这个想法在我作为测试构建的一个单独的、较小的解决方案中有效,但它在 Chromium 中无法正常工作。以下是标头和 .cc 文件:

变量.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

这是我尝试使用函数 getDevMem() 的地方:

#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.

我认为仅包含头文件就足以访问静态变量,但我不断收到未定义的符号错误。我的第一种方法是尝试使用 extern 关键字,但由于它更像 C,所以我选择了类实现,但我仍然有同样的问题。

C++ 谷歌浏览器 Chromium

评论


答:

0赞 minok 11/10/2022 #1

我让它工作了,我不得不编辑 BUILD.gn 文件在单独的文件夹中,以包括 .h 和 .cc 文件。

评论

0赞 Duke Dougal 1/3/2023
您能否显示解决方案中的所有文件 - BUILD.gn 文件和目录结构?