我懷疑這是一個骨頭的新手問題,但這是我自己無法回答的問題。如何構建一個ld命令,給定一個編譯和鏈接的g ++命令
我想在Ubuntu 12.04 LTS(32位)上使用嵌入式JavaScript引擎開發一個程序。我試過下載SpiderMonkey,但無法解決如何與它鏈接。所以,我已經下載了V8源代碼,至少有一個示例程序在Google Developers site上鍊接指令。
我已經下載了源代碼,並內置在/ some/path/or/other/v8中,並且已經將示例源代碼放入了v8Ex1中(我希望能夠快速移動到示例2,3和4--但是沒有運氣遠)in/some/path /或/ other。
一旦我確定哪些工作,爲32位,而不是64位編譯改變,我是能夠建立和使用命令行
g++ -Iv8/include v8Ex1.cc -o v8Ex1 -Wl,--start-group v8/out/ia32.release/obj.target/{tools/gyp/libv8_{base.ia32,snapshot},third_party/icu/libicu{uc,i18n,data}}.a -Wl,--end-group -lrt
我的下一個步驟是確定如何運行示例bash
擴大了命令行:
g++ -Iv8/include v8Ex1.cc -o v8Ex1 \
-Wl,--start-group v8/out/ia32.release/obj.target/tools/gyp/libv8_base.ia32.a \
v8/out/ia32.release/obj.target/tools/gyp/libv8_snapshot.a \
v8/out/ia32.release/obj.target/third_party/icu/libicuuc.a \
v8/out/ia32.release/obj.target/third_party/icu/libicui18n.a \
v8/out/ia32.release/obj.target/third_party/icu/libicudata.a \
-Wl,--end-group -lrt
該命令正常工作,建立一個可執行的,而不會產生任何錯誤或警告。
我預計在我的程序中有多個源文件,所以我最終會有幾個目標文件,並且需要將它們鏈接在一起。
我的下一步是構建獨立的編譯器和連接命令
g++ -c -Iv8/include v8Ex1.cc -o v8Ex1.o
編譯程序就好了,但我一直沒能制定出相應的鏈接命令應該是什麼。我最好的猜測是
ld -o v8Ex1 v8Ex1.o --start-group \
v8/out/ia32.release/obj.target/tools/gyp/libv8_base.ia32.a \
v8/out/ia32.release/obj.target/tools/gyp/libv8_snapshot.a \
v8/out/ia32.release/obj.target/third_party/icu/libicuuc.a \
v8/out/ia32.release/obj.target/third_party/icu/libicui18n.a \
v8/out/ia32.release/obj.target/third_party/icu/libicudata.a --end-group -lrt
但是這給了我3257個錯誤,開始與下面:
/usr/bin/ld.bfd.real: warning: cannot find entry symbol _start; defaulting to 000000000804a2e0
v8Ex1.o: In function `main':
v8Ex1.cc:(.text+0x1ab): undefined reference to `_Unwind_Resume'
v8Ex1.o:(.eh_frame+0x4b): undefined reference to `__gxx_personality_v0'
v8/out/ia32.release/obj.target/v8_base.ia32/src/isolate.o: In function `v8::internal::DateCache::~DateCache()':
isolate.cc:(.text._ZN2v88internal9DateCacheD0Ev[_ZN2v88internal9DateCacheD5Ev]+0xb): undefined reference to `operator delete(void*)'
v8/out/ia32.release/obj.target/v8_base.ia32/src/isolate.o: In function `v8::internal::Isolate::FindOrAllocatePerThreadDataForThisThread()':
isolate.cc(.text._ZN2v88internal7Isolate40FindOrAllocatePerThreadDataForThisThreadEv+0x88): undefined reference to `operator new(unsigned int)'
v8/out/ia32.release/obj.target/v8_base.ia32/src/isolate.o: In function `v8::internal::Isolate::StackTraceString()':
isolate.cc:(.text._ZN2v88internal7Isolate16StackTraceStringEv+0x15a): undefined reference to `operator delete[](void*)'
v8/out/ia32.release/obj.target/v8_base.ia32/src/isolate.o: In function `v8::internal::Isolate::PrintStack(_IO_FILE*)':
isolate.cc:(.text._ZN2v88internal7Isolate10PrintStackEP8_IO_FILE+0x15f): undefined reference to `operator delete[](void*)'
isolate.cc:(.text._ZN2v88internal7Isolate10PrintStackEP8_IO_FILE+0x1f0): undefined reference to `operator new(unsigned int)'
isolate.cc:(.text._ZN2v88internal7Isolate10PrintStackEP8_IO_FILE+0x218): undefined reference to `operator new(unsigned int)'
請有人可以幫助我正確的鏈接器命令。我想我可以自己將它封裝到Makefile中,然後我的程序就會全速前進。
瞭解圖書館如何工作,您必須與蜘蛛猴聯繫起來,而不是。如果你從不學習這個,搞砸了,你會成爲的。向我反饋,我想,尤達是我(出於某種原因)。 –
儘管如此,編譯一個庫與使用它不一樣;靜態鏈接和動態鏈接之間存在巨大差異。 –
擰緊我是;承認我做的。幫助我求求 – nurdglaw