当前位置:  技术问答>linux和unix

一个简单的C++编译问题

    来源: 互联网  发布时间:2016-06-26

    本文导语:  ////////////  test.h  /////////////// #ifndef __TEST_H__ #define __TEST_H__                                                                                                           ...




////////////  test.h  ///////////////
#ifndef __TEST_H__
#define __TEST_H__
                                                                                                                             
template 
class Test
{
public:
    int a(const char *str);
};
                                                                                                                             
#endif


////////////  test.cpp  ///////////////
#include 
#include "test.h"
                                                                                                                             
template 
int Test::a(const char *str)
{
    printf("%sn", str);
    return 0;
}


////////////  main.cpp  ///////////////
#include 
#include 
#include "test.h"
                                                                                                                             
int main(void)
{
    Test t;
    t.a("Cricket");
    return 0;
}



////////////  Makefile  ///////////////
CC = g++
SRC = main.cpp test.cpp
HEADER = test.h
EXEC = m.o
$(EXEC):$(SRC) $(HEADER)
    $(CC) $(SRC) -o $(EXEC)


编译时出错:
# make
g++ main.cpp test.cpp -o m.o
/tmp/ccAvYTLK.o(.text+0x1d): In function `main':
: undefined reference to `Test::a(char const*)'
collect2: ld returned 1 exit status
make: *** [m.o] Error 1

要是不用模板类的话就没问题, 这个该怎么解决啊?

|
   模板的分离编译为什么不行呢(而类的分离编译模型却可以)?

   这是一个链接错误,它指出错误发生在main函数中(main.cpp文件中),引用`Test::a(char const*)'是未定义的。

   分析:
   在main.cpp这个编译单元中,当编译器看到t.a("Cricket")调用,知道了模板实参是int(因为前面创建t时已经给出T是int),于是产生一个到Test::a(char const*)的引用。当编译器处理到文件test.cpp时,由于这是另外一个编译单元,编译器不知道用什么实参来进行实例化以产生函数定义。因此就不可能有实例出来的Test::a(char const*)函数定义(在这个编译单元中你又没有指定int给T,是吧),到链接时,就立即指出引用`Test::a(char const*)'是未定义的。

   这就是为什么模板的分离编译行不通。在test.h和test.cpp中的template之前均加一export就可以指出这些模板被导出,可以跨越多个编译单元,那当然就可以了。但C++标准的这种export template编译模型几乎就只是成了理论,在实践中很少有编译器支持export模板编译模型。

|
编译器暂时不支持模版的定义与实现分离,将test.cpp的东西也放在test.h中就好了

|
对于不支持模版编译的分离模式的编译器
乖乖把声明与定义放一块吧
也有其他方法 但是实质是一样的  就是让使用模版的代码处对模版定义可见
比如test.h 中include "test.cpp"

|
楼主,首先不应该使用分离模板。声明跟定义都放在.h里即可。
可以看看export关键字。

|

分离需要export关键字,可惜的是你用的编译器不支持.

|


谢谢!我编译的结果如下:

g++ main.cpp test.cpp -o m.o
/tmp/ccE2ZzVl.o: In function `main':
main.cpp:(.text+0x20): undefined reference to `Test::a(char const*)'
collect2: ld 返回 1
make: *** [m.o] 错误 1

|
http://topic.csdn.net/t/20061221/22/5247963.html

    
 
 

您可能感兴趣的文章:

  • C编译器 c++编译器 wieldylcc
  • 请教关于用c编译出来的.a文件和用c++编译出来的.a文件的互用问题
  • 怎样编译java, C++
  • Linux下怎样编译C++程序?
  • 在LINUX下的GCC编译C++的问题?
  • linux下的C++编译器怎样使用?
  • gcc与g++对于编译c++程序的区别
  • Unix下的CC能编译C++的程序吗?不是GCC
  • 关于在Ubuntu配置C++编译环境的问题
  • 请问,unix下的编译器支持c++的RTTI吗?
  • sco下常用的c++编译器有什么?在哪里下载?谢谢
  • 各位在Unix下开发,使用哪种c++编译器?
  • unix下有什么c++编译器
  • 在Linux下怎么编译C++程序?
  • 如何编译带头文件的C++程序阿??(第一次用g++)
  • 在UNIX下如何编译C++程序
  • 请问在Linux中用哪种编译器调试C++较好?
  • Linux 大家一般都用什么作为C++ 的编译工具?
  • 请问各位,java是跨平台的,但如果c++改一下编译器,也编译成字节码让虚拟机执行,是不是也跨平台了?
  • Flash的C++编译器 FlasCC
  • 关于arm交叉编译器4.3.3编译程序报错,但是3.4.5却能编译通过的问题
  • 关于EJB编译问题?(带的编译问题)
  • 编译问题,引用了别人的一个库,结果编译出问题。
  • eclipse 的c编译器编译问题
  • 关于在linux交叉编译powerpc-e300c3-linux-gcc的编译问题
  • 这个宏cc编译正常, pro*c 编译出问题,有办法解决吗?
  • 在linux+x86下用交叉编译器编译出能在solaris+x86运行的文件时遇到的问题
  • 菜鸟问题: redhat linux 编译一个最简单的c程序, 其中包含了<studio.h>头文件,但在gcc编译时,提示找不到studio.h文件,请问各位大大
  • 如果重新编译了.so文件后,但程序运行结果还是编译前的情况,大概是什么问题呢?
  • [菜鸟问题]简单的编译问题(我怎么编译不通过阿!)
  • JB的源文件在JB中可以编译,改用JDK编译,遇到一些问题,解决马上给分100!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux/centos源码安装nginx编译配置选项参数介绍
  • 请教:JSP编译器编译成字节码,跟别的编译器编译出来的有什么不同呢?
  • CentOS 6内核升级:下载编译启用新内核版本详细过程
  • 编译GCC时能不能只编译C/C++的编译器?
  • 高速的网络抓包库PF_ring介绍及编译安装
  • JB下,我的程序编译得好慢!请问用什么方法编译才可以快一点?或编译顺序改变一下?
  • 请问gdb是不是只能调试gcc编译的程序,在unix下用其它编译器编译的程序是不是不一定能用gdb调试的?
  • 用JCreator写了一个小程序,有十几个class,当修改某个文件重新编译,javac并没有编译修改的文件,请问要如何做javac才会重新编译所有的
  • 问:关于gcc编译器和g++编译器
  • 嵌入式linux开发:一段代码在windows平台用VC编译运行正常,在linux平台用gcc编译运行正常,但是用arm-linux-gcc编译在嵌入式板子上运行就不正常.
  • 在cygwin编译驱动程序要不要交叉编译?
  • 关于如何把编译进内核的编译成模块
  • 请教:JSP编译器编译成字节码,跟别的编译器编译出来的有什么不同呢? iis7站长之家
  • PROC开发时 //注释编译不通过 如何设置使用cpp编译。
  • 编译失败后如何再继续编译
  • 编译qt-x11,最后编译生成可执行文件时候,make出错
  • 如何查看已编译安装软件的编译命令行
  • 请问哪里有反编译.class文件的反编译器?
  • 用Jdk编译时出现提示要加 -deprecation 再编译,请教??
  • linux下有没有能编译出16bit代码的C语言编译器?
  • 我使用.net编译通过,但是使用g++编译不能通过。总是提示我undefined reference to ~myclass()


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3