2014-03-06 66 views
1

我懷疑這是一個骨頭的新手問題,但這是我自己無法回答的問題。如何構建一個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中,然後我的程序就會全速前進。

+0

瞭解圖書館如何工作,您必須與蜘蛛猴聯繫起來,而不是。如果你從不學習這個,搞砸了,你會成爲的。向我反饋,我想,尤達是我(出於某種原因)。 –

+0

儘管如此,編譯一個庫與使用它不一樣;靜態鏈接和動態鏈接之間存在巨大差異。 –

+0

擰緊我是;承認我做的。幫助我求求 – nurdglaw

回答

0

您還沒有指定您所看到的鏈接錯誤,所以我不能提供幫助的,但是以下信息可能會有所幫助:

  1. 如果你有多個源文件,你可以仍然編譯/一氣呵成將它們鏈接:如果您想單獨編譯它們(例如,對增量構建節約時間),你可以鏈接使用G ++

    g++ -Iv8/include v8Ex1.cc othersource.cc othersource2.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 
    
  2. - 只需指定地點的.o文件.c/.cc文件:

    g++ -Iv8/include v8Ex1.o othersource.o othersource2.o -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 
    

這可能一些摔跤的參數保存到ld

+0

道歉不包括在原來的帖子中的錯誤;也爲遲到的回覆 - 我已經離開了一個星期。 – nurdglaw

相關問題