5

我很难弄清楚在执行链接时要传递给 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 $@ $^
...

问题:

  • -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 $@

问题:

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

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


更新

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

4

1 回答 1

2

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

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

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

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

于 2012-07-01T00:02:13.753 回答