Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
479 views
in Technique[技术] by (71.8m points)

c - Windows编译v8时出现pkg-config错误(pkg-config errors on windows compiling v8)

I am trying to build ry/v8worker2 on windows.

(我正在尝试在Windows上构建ry / v8worker2。)

Everything goes fine until the point where I run go test which then complains about the pkg-config setup.

(一切正常,直到我进行go test为止,然后抱怨pkg-config设置。)

This is the pkg-config file which is generated:

(这是生成的pkg-config文件:)

Name: v8
Description: v8
Version: xxx
Cflags: -IC:Usersandyreagosrcgithub.com
eaandrewv8worker2v8include
Libs: out/v8build/obj/v8_monolith.lib

And this is the output when go test is executed:

(这是执行go test的输出:)

go build github.com/reaandrew/v8worker2: invalid flag in pkg-config --libs: out/v8build/obj/v8_monolith.lib
FAIL    github.com/reaandrew/v8worker2 [build failed]

As I say, the entire compilation went fine and files were created but at the end something is not correct.

(就像我说的那样,整个编译过程都很好,并且创建了文件,但是最后有些不正确。)

The only modifications to the build.py I have made to try and make this work on windows as here:

(我尝试对build.py进行的唯一修改,使其在Windows上可以正常运行,如下所示:)

diff --git a/build.py b/build.py
index 2cb5e6a..6f482c8 100755
--- a/build.py
+++ b/build.py
@@ -82,7 +82,7 @@ GCLIENT_SOLUTION = [
 ]

 def main():
-  lib_fn = os.path.join(prebuilt_path, platform_name(), "libv8_monolith.a")
+  lib_fn = os.path.join(root_path.replace("\","/"),"/out/v8build/obj/v8_monolith.lib")
   if args.rebuild or not os.path.exists(lib_fn):
     print("Rebuilding V8")
     lib_fn = Rebuild()
@@ -99,9 +99,9 @@ def Rebuild():

   EnsureDeps(v8_path)

-  gn_path = os.path.join(depot_tools, "gn")
+  gn_path = os.path.join(depot_tools, "gn.bat")
   assert os.path.exists(gn_path)
-  ninja_path = os.path.join(depot_tools, "ninja")
+  ninja_path = os.path.join(depot_tools, "ninja.exe")
   assert os.path.exists(ninja_path)

   gn_args = GN_ARGS.replace('
', ' ')
@@ -144,7 +144,8 @@ def EnsureDeps(v8_path):
   env = os.environ.copy()
   # gclient needs to have depot_tools in the PATH.
   env["PATH"] = depot_tools + os.pathsep + env["PATH"]
-  subprocess.check_call(["gclient", "sync", "--spec", spec],                                                           +  gclient_path = os.path.join(depot_tools, "gclient.bat")
+  subprocess.check_call([gclient_path, "sync", "--spec", spec],
                         cwd=root_path,
                         env=env)

There is very little documented (that I can find) about how to compile this project on windows.

(关于如何在Windows上编译此项目的文献很少(我可以找到)。)

UPDATE: If I change the pkg-config to:

(更新:如果我将pkg-config更改为:)

Name: v8
Description: v8
Version: xxx
Cflags: -Iv8/include
Libs: -Lout/v8build/obj/v8_monolith.lib

Then the output of go test is now:

(那么go test的输出现在是:)

# github.com/reaandrew/v8worker2
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o: In function `Recv':
./binding.cc:333: undefined reference to `v8::HandleScope::HandleScope(v8::Isolate*)'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o:C:Usersandyreagosrcgithub.com
eaandrewv8worker2/v8/include/v8.h:9626: undefined reference to `v8::HandleScope::CreateHandle(v8::internal::Isolate*, v8::internal::Object*)'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o: In function `Recv':
./binding.cc:338: undefined reference to `v8::Value::IsFunction() const'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o:C:Usersandyreagosrcgithub.com
eaandrewv8worker2/v8/include/v8.h:9717: undefined reference to `v8::V8::DisposeGlobal(v8::internal::Object**)'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o:C:Usersandyreagosrcgithub.com
eaandrewv8worker2/v8/include/v8.h:9670: undefined reference to `v8::V8::GlobalizeReference(v8::internal::Isolate*, v8::internal::Object**)'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o: In function `Recv':
./binding.cc:333: undefined reference to `v8::HandleScope::~HandleScope()'
./binding.cc:333: undefined reference to `v8::HandleScope::~HandleScope()'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o:C:Usersandyreagosrcgithub.com
eaandrewv8worker2/v8/include/v8.h:9385: undefined reference to `v8::Locker::Initialize(v8::Isolate*)'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o: In function `Send':
./binding.cc:351: undefined reference to `v8::EscapableHandleScope::EscapableHandleScope(v8::Isolate*)'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o:C:Usersandyreagosrcgithub.com
eaandrewv8worker2/v8/include/v8.h:9626: undefined reference to `v8::HandleScope::CreateHandle(v8::internal::Isolate*, v8::internal::Object*)'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o: In function `Send':
./binding.cc:356: undefined reference to `v8::Value::IsArrayBuffer() const'
./binding.cc:359: undefined reference to `v8::ArrayBuffer::GetContents()'
./binding.cc:367: undefined reference to `v8::ArrayBuffer::New(v8::Isolate*, void*, unsigned long long, v8::ArrayBufferCreationMode)'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o:C:Usersandyreagosrcgithub.com
eaandrewv8worker2/v8/include/v8.h:1031: undefined reference to `v8::EscapableHandleScope::Escape(v8::internal::Object**)'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o:C:Usersandyreagosrcgithub.com
eaandrewv8worker2/v8/include/v8.h:1022: undefined reference to `v8::HandleScope::~HandleScope()'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o: In function `Send':
./binding.cc:350: undefined reference to `v8::Locker::~Locker()'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o:C:Usersandyreagosrcgithub.com
eaandrewv8worker2/v8/include/v8.h:1022: undefined reference to `v8::HandleScope::~HandleScope()'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o: In function `Send':
./binding.cc:350: undefined reference to `v8::Locker::~Locker()'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o: In function `Print':
./binding.cc:313: undefined reference to `v8::HandleScope::HandleScope(v8::Isolate*)'
./binding.cc:319: undefined reference to `v8::String::Utf8Value::Utf8Value(v8::Local<v8::Value>)'
./binding.cc:319: undefined reference to `v8::String::Utf8Value::~Utf8Value()'
./binding.cc:313: undefined reference to `v8::HandleScope::~HandleScope()'
./binding.cc:313: undefined reference to `v8::HandleScope::HandleScope(v8::Isolate*)'
./binding.cc:319: undefined reference to `v8::String::Utf8Value::~Utf8Value()'
./binding.cc:313: undefined reference to `v8::HandleScope::~HandleScope()'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o: In function `ExitOnPromiseRejectCallback(v8::PromiseRejectMessage)':
./binding.cc:65: undefined reference to `v8::Isolate::GetCurrent()'
./binding.cc:68: undefined reference to `v8::HandleScope::HandleScope(v8::Isolate*)'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o:C:Usersandyreagosrcgithub.com
eaandrewv8worker2/v8/include/v8.h:9626: undefined reference to `v8::HandleScope::CreateHandle(v8::internal::Isolate*, v8::internal::Object*)'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o: In function `ExitOnPromiseRejectCallback(v8::PromiseRejectMessage)':
./binding.cc:73: undefined reference to `v8::Exception::CreateMessage(v8::Isolate*, v8::Local<v8::Value>)'
./binding.cc:74: undefined reference to `v8::String::NewFromUtf8(v8::Isolate*, char const*, v8::String::NewStringType, int)'
./binding.cc:75: undefined reference to `v8::Context::Global()'
./binding.cc:75: undefined reference to `v8::Object::Get(v8::Local<v8::Value>)'
./binding.cc:77: undefined reference to `v8::Value::IsFunction() const'
./binding.cc:80: undefined reference to `v8::Message::GetScriptOrigin() const'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o:C:Usersandyreagosrcgithub.com
eaandrewv8worker2/v8/include/v8.h:10289: undefined reference to `v8::Isolate::GetCurrent()'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o:C:Usersandyreagosrcgithub.com
eaandrewv8worker2/v8/include/v8.h:10289: undefined reference to `v8::Isolate::GetCurrentContext()'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o:C:Usersandyreagosrcgithub.com
eaandrewv8worker2/v8/include/v8.h:10289: undefined reference to `v8::Value::ToString(v8::Local<v8::Context>) const'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o: In function `ExitOnPromiseRejectCallback(v8::PromiseRejectMessage)':
./binding.cc:82: undefined reference to `v8::Message::GetScriptResourceName() const'
./binding.cc:86: undefined reference to `v8::Context::Global()'
./binding.cc:86: undefined reference to `v8::Function::Call(v8::Local<v8::Value>, int, v8::Local<v8::Value>*)'
./binding.cc:90: undefined reference to `v8::Message::PrintCurrentStackTrace(v8::Isolate*, _iobuf*)'
./binding.cc:68: undefined reference to `v8::HandleScope::~HandleScope()'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o: In function `ExceptionString[abi:cxx11](worker_s*, v8::TryCatch*)':
./binding.cc:126: undefined reference to `v8::HandleScope::HandleScope(v8::Isolate*)'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o:C:Usersandyreagosrcgithub.com
eaandrewv8worker2/v8/include/v8.h:9626: undefined reference to `v8::HandleScope::CreateHandle(v8::internal::Isolate*, v8::internal::Object*)'
C:UsersandyreaAppDataLocalTempgo-build332228766055\_x003.o: In function `ExceptionString[abi:cxx11](worker_s*, v8::TryCatch*)':
./binding.cc:128: undefined reference to `v8::TryCatch::Exception() const'
./binding.cc:128: undefined reference to `v8::String::Utf8Value::Utf8Value(v8::Local<v8::Value>)'
./binding.cc:131: undefined reference to `v8::TryCatch::Message() const'
./binding.cc:140: undefined reference to `v8::Message::GetScriptOrigin() const'
./binding.cc:140: undefined reference to `v8::String::Utf8Value::Utf8Value(v8::Local<v8::Value>

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

For security reasons , the Go compiler has a whitelist of arguments that can appear in pkg-config files, and refuses to use arguments that don't appear on the list.

(出于安全原因 ,Go编译器有一个白名单参数可以出现在pkg-config文件中,并且拒绝使用未出现在列表中的参数。)

One whitelist entry allows pointing the linker to static libraries directly: it covers files with the extension .a , but not .lib .

(一个白名单条目允许将链接程序直接指向静态库:它涵盖扩展名为.a文件,但不包括.lib 。)

You can try putting [a-zA-Z0-9_/].*\.lib in the CGO_LDFLAGS_ALLOW environment variable to make it pass the check… but I suspect that this would probably not work anyway.

(您可以尝试将[a-zA-Z0-9_/].*\.lib CGO_LDFLAGS_ALLOW [a-zA-Z0-9_/].*\.lib CGO_LDFLAGS_ALLOW环境变量中,以使其通过检查……但是我怀疑这可能还是行不通的。)

.lib files are produced by MSVC, and they are in a different format from Unix ar (which is what .a files are, and probably what the Go compiler expects).

(.lib文件是由MSVC产生的,它们的格式与Unix ar格式不同( .a文件的格式,也可能是Go编译器期望的格式)。)

The real fix would be get V8 to compile with GCC instead of MSVC and produce a proper .a file, but V8 doesn't officially support it on Windows, and getting it to work would apparently require a far more invasive patch.

(真正的解决方法是使V8与GCC而不是MSVC一起编译并生成适当的.a文件,但是V8并没有在Windows上正式支持它,并且使其正常工作显然需要更具侵入性的补丁。)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...