链接对象和静态库

Mih*_*dor 5 c++ linker makefile g++ gmp

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

CXXFLAGS = -Wall -Wextra -Wconversion -pedantic -std=c++0x -O2
Run Code Online (Sandbox Code Playgroud)

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

libxxx.a: xxx1.o xxx2.o ...
    ar rcs $@ $^
libyyy.a: yyy1.o yyy2.o ...
    ar rcs $@ $^
...
Run Code Online (Sandbox Code Playgroud)

问题:

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

创建静态库之后,我想将一些已编译的.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 $@
Run Code Online (Sandbox Code Playgroud)

问题:

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

另外,在链接期间,它为我提供了有关GMP库中未定义引用的例外。据我所知,-lgmp发送到链接器并安装在系统上(我能够通过命令行使用GMP编译一个简单的hello世界),而libxxx.a libyyy.a libzzz.a是位于$(LIB_DIR)中。也许我应该提到libxxx.a中使用了GMP符号。


更新

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

小智 2

问:我还应该在这里使用 -static 标志吗?答: 可能没有必要。这个标志只是使得不可能意外地链接到动态库中。

问:-Wall 在这里有意义吗?或者它仅对编译有用?A:我相信这只是为了编译。(仅供参考,大写 W 后跟您希望在编译期间出现所有警告的“所有”物种)

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

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

  • 其他任何事情都会是[货物崇拜方法](http://www.lhup.edu/~dsimanek/cargocul.htm)。这就是你复制别人正在做的事情而不了解正在发生的事情的地方。这是一种效率低下的方法,但遗憾的是很受欢迎。 (2认同)
  • 诚然,gcc 的联机帮助页没有明确说明 -Wall 不会影响链接器。然而,如果您查看选项,链接器选项非常有限,并且根本没有列出任何警告,这是第一个提示。如果您在联机帮助页中搜索 -Wall,您会发现它仅启用预处理器和 C/C++ 编译器标志。通过消除,它不会在其他地方启用警告。很容易在路径中放置一个简短的脚本,然后再查看 gcc 调用链接器的标志,以说服自己 -Wall 仅适用于预处理/编译。 (2认同)