g++生成空的对象文件
g++ produces empty object file
我正试图将一个基本的数组包装器模板类编译到.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.
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在h文件中包含.o对象文件
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 从对象文件(.o)在macos上制作归档文件(.a文件)
- 检测 COFF 对象文件中C++内联符号
- 特定对象文件的单线程生成
- 使用对象文件读取三角形数据网格
- 链接时,不同静态库中的同一对象文件
- 防止临时对象文件访问 MSVC 中的磁盘
- 对在不同二进制文件中创建的对象文件的依赖关系
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 是否有正确的方法对生成文件中的对象文件使用模板命令?(C++)
- ./main:加载共享库时出错:libopencv_highgui.so.4.0:无法打开共享对象文件:没有这样的文件或
- 使用 make 将对象文件放在特定目录中
- 如何从 3d 对象文件中获取 3d 坐标
- 为什么我的生成文件没有生成对象文件?
- 如何在OSX上正确创建C++对象文件(.o)
- sf::Windows上的音乐:api-ms-win-crt-locale-l1-1-0.dll:无法打开共享对象文件
- 使用nvcc(CUDA-RINSIDE)正确链接对象文件
- 链接节点本机模块中的提升库,对象文件需要替代库版本