提问人:minok 提问时间:11/9/2022 更新时间:7/17/2023 访问量:195
如何在 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
问:
我正在做一个处理 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,所以我选择了类实现,但我仍然有同样的问题。
答:
0赞
minok
11/10/2022
#1
我让它工作了,我不得不编辑 BUILD.gn 文件在单独的文件夹中,以包括 .h 和 .cc 文件。
评论
0赞
Duke Dougal
1/3/2023
您能否显示解决方案中的所有文件 - BUILD.gn 文件和目录结构?
评论