01 [ error: #include resolved using non-portable Microsoft search rules as ] 解决方法
当引入新的头文件时,有时会提示一些依赖错误。
比如:在 media/filters/ffmpeg_demuxer.cc
中 引入头文件
···
#include “third_party/blink/public/web/web_local_frame.h”
#include “third_party/blink/public/web/web_local_frame_client.h”
···
会提示如下错误:
In file included from ../../media/filters/ffmpeg_demuxer.cc:5:
In file included from ../..\media/filters/ffmpeg_demuxer.h:53:
In file included from ../..\third_party/blink/public/web/web_local_frame_client.h:74:
In file included from ../..\third_party/blink/public/web/web_dom_message_event.h:38:
In file included from ../..\third_party/blink/public/web/web_document.h:40:
In file included from ../..\third_party/blink/public/web/web_frame.h:40:
In file included from ../..\third_party/blink/public/web/web_node.h:38:
In file included from ../..\v8/include/v8.h:29:
../..\v8/include/cppgc/common.h(9,10): error: #include resolved using non-portable Microsoft search rules as: ../..\v8/include/v8config.h [-Werror,-Wmicrosoft-include]
#include "v8config.h" // NOLINT(build/include_directory)
^
1 error generated.
[2/165] CXX obj/media/blink/blink/webmediaplayer_impl.obj
ninja: build stopped: subcommand failed.
打开third_party/blink/public/web/web_local_frame_client.h
文件发现确实引用了v8.h
...
#include "v8/include/v8.h"
...
再查看v8.h
,发现如下内容
...
#include "cppgc/common.h"
#include "v8-internal.h" // NOLINT(build/include_directory)
#include "v8-version.h" // NOLINT(build/include_directory)
#include "v8config.h" // NOLINT(build/include_directory)
...
根据提示,查看web_local_frame_client.h
及web_local_frame_client.cc
最近的 *.gn
或者 *.gni
是 src/third_party/blink/public/BUILD.gn
。查看 src/third_party/blink/public/BUILD.gn
中 v8.h 相关的配置,发现如下一句内容。
...
config("blink_headers_config") {
# Allow :blink_headers to include v8.h without linking to it.
configs = [ "//v8:external_config" ]
}
...
猜测,配置依赖应该是 configs = [ "//v8:external_config" ]
。
于是,把 "//v8:external_config"
加入 目标的 BUILD.gn
中,即 src/media/filters/ffmpeg_demuxer.cc
相关的 src/media/filters/BUILD.gn
中。
查找 src/media/filters/ffmpeg_demuxer.cc
的对应配置信息,大约在如下位置加入后,编译通过
configs += [
# TODO(crbug.com/167187): Fix size_t to int truncations.
"//build/config/compiler:no_size_t_to_int_warning",
"//media:subcomponent_config",
# 在如下位置加入v8的依赖
"//v8:external_config",
]
02 debug版本缺少dll依赖配置的错误信息
如果调整了依赖,提示符号没有定义, lld-link: error: undefined symbol: ...
,那可能是因为debug版本编译时,采用组件模式,会产生很多dll,刚好,你引入的内容,在另外一个dll里面。这样的话,可以为debug版本引入 xxxxxx.dll.lib
依赖.
/IMPLIB:./media.dll.lib /DLL /PDB:./media.dll.pdb @./media.dll.rsp
lld-link: error: undefined symbol: __declspec(dllimport) public: void __thiscall blink::BrowserInterfaceBrokerProxy::GetInterface(class mojo::GenericPendingReceiver) const
>>> referenced by .\..\..\media\filters\ffmpeg_demuxer.cc:1899
>>> obj/media/filters/filters/ffmpeg_demuxer.obj:(private: void __thiscall media::FFmpegDemuxer::OrayInit(void))
[2/543] ACTION //components/resources:about_credits(//build/toolchain/win:win_clang_x86)
ninja: build stopped: subcommand failed.
比如:上面的修改刚好引用到了 blink_common.dll.lib
libs = []
# 在对应的libs里面,针对组件编译(Debug)加入需要的依赖
if (is_component_build) {
libs += ["blink_common.dll.lib",]
}
03 too many errors emitted 错误
如果在多个 xxx.gn 中引入相同的代码文件,会出现如下提示,
lld-link: error: too many errors emitted, stopping now (use /errorlimit:0 to see all errors)