【问题标题】:How to construct an ld command, given a g++ command that compiles and links如何构造一个ld命令,给定一个编译和链接的g++命令
【发布时间】:2014-03-16 17:11:17
【问题描述】:

我怀疑这是一个愚蠢的新手问题,但我无法自己回答。

我想在 Ubuntu 12.04 LTS(32 位)上开发一个带有嵌入式 javascript 引擎的程序。我试过下载 SpiderMonkey 但不知道如何链接它。所以,我已经下载了 V8 源代码,其中至少有一个示例程序,上面有 Google Developers site 上的链接说明。

我已经下载了源代码并内置在 /some/path/or/other/v8 中,并将示例源代码放入 v8Ex1(我曾希望快速转到示例 2、3 和 4 - 但到目前为止还没有运气) 在 /some/path/or/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 中,然后我的程序就会全速前进。

【问题讨论】:

  • 必须了解库的工作原理,链接蜘蛛猴,这并不难。如果你从来没有学会这个,搞砸了,你会的。我倒着说,想想我是尤达(出于某种原因)。
  • 说真的,编译一个库和使用它是不一样的。静态链接和动态链接之间存在巨大差异。
  • 我搞砸了;承认我愿意。求求帮助
  • 搜索“创建共享库linux”并享受,这真的很容易。然后链接将有意义,您可以自信地编写它。我曾经和你一样(我是菜鸟:P),我讨厌那个红脸的“来吧,这很简单!”当复制和粘贴不起作用时,您会感到自己需要放松和学习。 Unix 的东西真的很简单,因为你可以通过知道它的作用来推断它是如何工作的。
  • 请原谅我在没有搜索如何创建共享库的情况下做出回应,但我肯定是在尝试创建可执行文件,而不是共享库。我同意在某个合理的地方共享库可能比当前在各种地方选择的存档文件更容易链接,但我必须从某个地方开始,我认为我选择尝试构建一个可执行文件,隐藏所有的肮脏在 Makefile 中是一个很好的。无论如何,说服我否则......

标签: unix ubuntu-12.04 ld


【解决方案1】:

您尚未指定您看到的链接器错误,因此我无法提供帮助,但以下信息可能会有所帮助:

  1. 如果您有多个源文件,您仍然可以一次编译/链接它们:

    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. 如果您想单独编译它们(例如,为了节省增量构建的时间),您可以使用 g++ 链接 - 只需指定 .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 的争论的麻烦。

【讨论】:

  • 很抱歉没有在原帖中包含错误;也为迟到的答复 - 我已经离开了一个星期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
相关资源
最近更新 更多