g++ 生成空目标文件

问题描述 投票:0回答:2

我正在尝试将基本数组包装模板类编译到 .o 文件中,以尝试找出如何创建动态库。但是,当使用

编译源代码时
g++ -std=c++0x -c array.cpp

生成的文件只有 ~650 字节。我用 nm 检查了该文件,发现它包含的唯一符号是

00000001 r _ZStL13allocator_arg
00000000 r _ZStL19piecewise_construct

这似乎是 C++11 编译的功能,因为在没有 -std=c++0x 标志的情况下编译时,它们消失了。

尝试使用命令编译程序测试代码以及所有内容

g++ -std=c++0x -o tester tester.cpp array.cpp

对 array.cpp 中的所有内容都会产生链接器错误,但在其他方面可以干净地编译。

老实说我不知道这是怎么回事。如果您怀疑这是我的代码本身的问题,而不是我编译它的方式的问题,我可以发布 array.cpp 和 array.hpp 的内容。

c++ c++11 linker g++
2个回答
9
投票

这很正常。模板仅在“实例化”时才会生成代码,而您还没有这样做。您只提供了模板。当编译器编译模板时,它没有理由生成模板的任何特定实例,并为模板参数填充实际类型。 随后,编译器会编译其他源文件,您在其中使用模板类型。这也不会导致实例化。它只是告诉编译器它应该期望在其他地方找到模板的实例。编译器在目标文件中注意到这一点。然后,链接器查找编译器认为应该查找的定义,但失败了。

这就是为什么总是建议您在标头中提供与声明内联的模板定义。这样,当编译器看到您使用模板时,它可以使用它在标头中看到的定义立即实例化模板。如果您在多个源文件中使用模板,则多次实例化模板可能会导致多个定义,但这是允许的,并且链接器知道如何处理它。

另一种方法是在

array.cpp

文件中显式实例化模板,但内联定义模板成员更容易。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.