gpt4 book ai didi

c++ - g++ 产生空目标文件

转载 作者:太空狗 更新时间:2023-10-29 20:06:09 24 4
gpt4 key购买 nike

我正在尝试将一个基本的数组包装器模板类编译成一个 .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 的内容。

最佳答案

这很正常。模板只有在被实例化 时才会生成代码,而您还没有这样做。您只提供了模板。当编译器编译模板时,它没有理由生成模板的任何特定实例,并为模板参数填充实际类型。

稍后,编译器编译其他源文件,您在其中使用模板类型。这也不会导致实例化。它只是告诉编译器它应该期望在别处找到模板的实例。编译器在目标文件中注意到这一点。链接器然后查找编译器说它应该找到的定义,但它失败了。

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

另一种方法是在您的 array.cpp 文件中显式实例化模板,但仅内联定义模板成员会更容易。

关于c++ - g++ 产生空目标文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9302541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com