Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ g++;生成空的对象文件_C++_Compiler Construction_Linker_G++_C++11 - Fatal编程技术网

C++ g++;生成空的对象文件

C++ g++;生成空的对象文件,c++,compiler-construction,linker,g++,c++11,C++,Compiler Construction,Linker,G++,C++11,我正试图将一个基本的数组包装器模板类编译成一个.o文件,试图找出如何创建动态库。但是,在使用编译源代码时 g++ -std=c++0x -c array.cpp 生成的文件只有约650字节。我用nm检查了这个文件,发现它包含的唯一符号是 00000001 r _ZStL13allocator_arg 00000000 r _ZStL19piecewise_construct 这似乎是C++11编译的特性,因为在没有-std=C++0x标志的情况下编译时,它们就消失了 试图用命令编译程序测试代

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

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

稍后,编译器将编译使用模板类型的其他源文件。这也不会导致实例化。它只告诉编译器应该在别处找到模板的实例。编译器在对象文件中指出。链接器然后查找编译器说它应该找到的定义,但失败了

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


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

如果array.cpp仅包含模板,则不单独编译,您可能将其称为array.hpp。

您试图编译一个未实例化的模板?模板不像代码生成工具那样是代码。只编译实际代码。它在tester.cpp中实例化为数组;我只是尝试在没有tester.cpp的情况下进行编译,以便弄清楚为什么尽管.cpp.Template定义中的所有函数都必须放在头文件中,但第二个(按时间顺序排列的第一个)compile命令会导致链接器错误。未实例化的模板不是代码,因此不会向对象文件添加任何内容。啊。我现在觉得自己有点像个白痴;我会试试的。很有帮助。。花了很多时间找到这个。你能提供一个好的方法来提供模板的内联声明和声明吗?请参阅,@Warren。宣言发表后立即实施。(同一文件中是否存在
main
,与此处无关。)