c++ - 链接对象和静态库

标签 c++ linker makefile g++ gmp

我很难弄清楚在执行链接时要传递给 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 库的 undefined reference 的异常。据我所知,-lgmp 被发送到链接器并安装在系统上(我能够从命令行编译一个使用 GMP 的简单 hello world)和 libxxx.a libyyy.a libzzz.a 是位于 $(LIB_DIR)。也许我应该提到 GMP 符号在 libxxx.a 中使用。


更新:

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

最佳答案

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

问:-Wall 在这里有意义吗,还是仅对编译有用? A:我相信它只是为了编译。 (仅供引用,大写字母 W 后跟单词“所有”物种,您希望在编译期间获得所有警告)

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

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

关于c++ - 链接对象和静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11278438/

相关文章:

c++ - 如何使用常规 makefile 构建依赖于 boost 的项目?

c++ - 使用 .dll 的方法

c++ 从 dll 导入函数 - 我的 dll 不导出 lib

python - 安装pyipopt的问题

c - Makefile - 使用正则表达式导出

makefile - 将makefile(> 131000个字符)变量的内容写入文件?

c++ - IBM XL C/C++ 编译器中的 `1587-163` 是什么意思

java - C++ 和 Java 应用程序的最佳数据库

c++ - 用于批量断点的 Visual Studio 插件

c++ - 非模板类与模板类的多重定义