【问题标题】:Linking objects and static libraries链接对象和静态库
【发布时间】:2012-07-01 23:14:02
【问题描述】:

我很难弄清楚在执行链接时要传递给 g++ 的标志。基本上,我用这些“标准”标志编译了一些代码:

CXXFLAGS = -Wall -Wextra -Wconversion -pedantic -std=c++0x -O2

然后,我将生成的 .o 文件合并到几个静态库中,如下所示:

libxxx.a: xxx1.o xxx2.o ...
    ar rcs $@ $^
libyyy.a: yyy1.o yyy2.o ...
    ar rcs $@ $^
...

问题:

  • 编译 .o 文件时是否需要在 CXXFLAGS 中使用 -static 标志?

创建静态库后,我想将一些已编译的 .o 文件与其中一些库链接在一起以构建可执行文件,因此我使用了这个:

LINKER = g++
LIB_DIR = lib/linux
SYSTEM_LIBS = -lgmp
LDFLAGS = -Wall -L $(OUTPUT_DIR) -L $(LIB_DIR) $(SYSTEM_LIBS)
$(LINKER) $^ $(LDFLAGS) -lsvm -lUtils -lKinderedSpirits -o $@

exe:
    $(LINKER) o1.o o2.o $(LDFLAGS) -lxxx -lyyy -lzzz -o $@

问题:

- 我应该在这里使用-static 标志吗? - -Wall 在这里有意义还是仅对编译有用? - 是否有任何其他“标准”标志需要传递给链接器,类似于为编译器推荐的标志?

此外,在链接过程中,它给了我关于 GMP 库中未定义引用的例外情况。据我所知,-lgmp 被发送到链接器并安装在系统上(我能够从命令行编译一个使用 GMP 的简单 hello world)和 libxxx.a libyyy.a libzzz.a位于 $(LIB_DIR)。也许我应该提一下,在 libxxx.a 中使用了 GMP 符号。


更新

我设法修复了 GMP 符号的未定义引用。这个问题是由我放置库的顺序引起的。基本上,按照here 的规定,我需要在-lgmp 之前引用依赖于GMP 的库。无论如何,我仍在寻找上述3问题的答案。

【问题讨论】:

  • 当您说“静态库”时,您的意思是实际上您创建了一个 .a 静态库文件,可能使用 ar?
  • 是的,没错。我将编辑问题以澄清。

标签: c++ linker makefile g++ gmp


【解决方案1】:

问:我是否也应该在这里使用 -static 标志? 答:可能没有必要。这个标志只是防止意外链接到动态库。

问:-Wall 在这里是否有意义,还是仅对编译有用? A:我相信它只是为了编译。 (仅供参考,大写的 W 后跟单词“all”你想要编译期间的所有警告)

问:是否还有其他“标准”标志需要传递给链接器,类似于为编译器推荐的标志? 答:我不知道。您可以在这里找到常用选项:http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

您是否遇到任何需要粘贴的特定错​​误?

【讨论】:

  • 现在编译和链接都很好,但我想确保我做对了。关于链接,我可以自己使用谷歌,谢谢,但我想知道是否有一些外行指南,说明哪些链接器标志被认为是“标准的”并且必须(几乎)总是使用,就像我提到的编译器标志一样。跨度>
  • 一般来说,命令行参数可以告诉编译器你想要什么。如果你自己都不知道自己想要什么,那就这样吧。要么你有某个标志的原因,要么你没有。如果你这样做,你知道的。如果没有,为什么要编一个?也许您应该搜索 gcc 联机帮助页以了解开始的内容。
  • 必须“(几乎)总是”使用的“标准”标志的概念,严肃地说,除了在上面的评论中不存在。您可以只使用告诉 gcc 输入和输出文件是什么的标志来编译和链接完美的项目。如果你有一个特定的问题,例如你想知道你的代码中可能存在的一些问题,那么特定的解决方案就是 -Wall 标志。因此,正确的做法是: 1. 了解您的要求。 2. 根据要求应用标志。
  • 其他的都是cargo cult approach。这就是你在不了解发生了什么的情况下复制其他人正在做的事情的地方。这是一种几乎没有效率的方法,但很受欢迎。
  • 诚然,gcc 的手册页没有明确说明 -Wall 确实 影响链接器。但是,如果您查看选项,链接器选项非常有限,并且根本没有列出任何警告,这是第一个提示。如果您在手册页中搜索 -Wall,您会看到它仅启用预处理器和 C/C++ 编译器标志。通过消除,它不会在其他任何地方启用警告。很容易在你的路径中放置一个简短的脚本,然后查看 gcc 调用链接器的标志来说服自己 -Wall 仅适用于预处理/编译。
猜你喜欢
  • 2011-11-11
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2018-01-23
  • 1970-01-01
相关资源
最近更新 更多