免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1338 | 回复: 7
打印 上一主题 下一主题

怎样将.o联编.C? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-11 17:09 |只看该作者 |倒序浏览
在C中可以将库文件编译成.o后,在编译.c时顺序添加.o就能将.o中的函数联编到程序中。
在C++中可以这么做么?一下是我的例子,编译出错,请指教!
[头文件“stringClassTest.h”]
#include <iostream>;
using namespace std ;

class String ;

istream& operator>;>;(istream& , String&;
ostream& operator<<(ostream& , String&;

class String
{
public :
String();
String(const char *);
String(const String&;

~String();

String& operator=(const String&;
String& operator=(const char *);
bool operator==(const String&;
bool operator==(const char *);
char& operator[](int);

int size() {return _size;}
char* c_str(){return _string;}
private :
char *_string ;
int _size ;
};
[类函数实现.C “stringClassTest.C”]
#include <cstring>;
#include <cassert>;
#include <iomanip>;
#include "stringClassTest.h"


bool String:perator==(const String &rhs)
{
if ( _size != rhs._size)
return false ;
else
return strcmp(_string , rhs._string )? false : true ;
}

bool String:perator==(const char * rhc)
{
return strcmp(_string , rhc )? false : true ;
}

inline String::String()
{
_size = 0 ;
_string = NULL ;
}

inline String::String(const char * rhc)
{
if (rhc == NULL)
{
_size = 0 ;
_string = NULL ;
}
else
{
_size = strlen(rhc);
_string = new char[_size+1] ;
strcpy(_string , rhc);
}

}

inline String::String(const String &rhs)
{
if (rhs._string == NULL)
{
_size = 0 ;
_string = NULL ;
}
else
{
_size = rhs._size ;
_string = new char[_size+1] ;
strcpy(_string , rhs._string);
}
}

inline String::~String()
{
delete [] _string ;
}

inline String& String:perator=(const String &rhs)
{
if (this != &rhs)
{
delete [] _string ;
if (rhs._string == NULL)
{
_size = 0 ;
_string = NULL;
}
else
{
_size = rhs._size ;
_string = new char[_size+1];
strcpy(_string , rhs._string);
}
}
return *this;
}

inline String& String:perator=(const char *rhc)
{
delete [] _string ;
if (rhc == NULL)
{
_size = 0 ;
_string == NULL ;
}
else
{
_size = strlen(rhc);
_string = new char[_size+1];
strcpy(_string , rhc);
}
return *this ;
}

inline char& String:perator[](int elem)
{
assert(elem >;=0 && elem <_size);
return _string[elem];
}

inline istream& operator>;>;(istream &io , String &rhs)
{
const int limit_string_size = 4096 ;
char inBuf[limit_string_size] ;

io >;>; setw(limit_string_size) >;>; inBuf ;
rhs = inBuf ;
return io ;
}

inline ostream& operator<<(ostream &os , String &rhs)
{
return os << rhs.c_str();
}
[应用程序Stringtest.c]
#include <iostream>;
#include "stringClassTest.h"

using namespace std ;

int main()
{
String a ;
a="String type" ;
cout << a << endl ;
}

先使用gcc -c stringClassTest.C 编译成stringClassTest.o,ok。
再用g++ -o Stringtest Stringtest.C stringClassTest.o 出错。
Undefined first referenced
symbol in file
operator<<(std::basic_ostream<char, std::char_traits<char>; >;&, String&/var/tmp/
/ccAeDx8c.o
String::String[in-charge]() /var/tmp//ccAeDx8c.o
String::~String [in-charge]() /var/tmp//ccAeDx8c.o
String:perator=(char const*) /var/tmp//ccAeDx8c.o
ld: fatal: Symbol referencing errors. No output written to Stringtest
collect2: ld returned 1 exit status

为什么?怎么办?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2004-03-11 17:17 |只看该作者

怎样将.o联编.C?

干嘛不都用g++编译?

论坛徽章:
0
3 [报告]
发表于 2004-03-11 18:09 |只看该作者

怎样将.o联编.C?

有区别么?
gcc 也能编译C++,办不能link。
gcc 可以编译C++,还可以link。
我想他们的c++编译器是一个吧?

论坛徽章:
0
4 [报告]
发表于 2004-03-11 18:11 |只看该作者

怎样将.o联编.C?

g++试了,不可以!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2004-03-11 18:23 |只看该作者

怎样将.o联编.C?

什么叫不可以?
不明白你为什么一个用gcc,
一个用g++。
怎么用大写的C做后缀名,笔误?
还有你的代码又长又乱,
没几个人愿意看的。

论坛徽章:
0
6 [报告]
发表于 2004-03-11 18:46 |只看该作者

怎样将.o联编.C?

原帖由 "gbunix" 发表:

先使用gcc -c stringClassTest.C 编译成stringClassTest.o,ok。
再用g++ -o Stringtest Stringtest.C stringClassTest.o 出错。

首先说明,这样的编译连接方式没有问题。gcc或g++编译器支持用.c和.C区分C和C++源程序。

编译连接过程中出现错误,完全是由你的程序对inline的误用所引起的。对于类的构造函数、析构函数以及 operator 等都不能进行inline声明,否则使用时会引起联接错误

(编辑增加以下内容)
注意:看了gbunix在下面的提示,知道了我在上面的红色部分的描述是错误的。正确的说法应该是“对用inline声明的类成员函数,其函数体的实现必须跟类的定义放到同一个文件中,不能分开存放”,类成员函数可以是inline的。而且在我的印象中类的析构函数虽然写成函数的形式,但其实是“嵌入”在对象里面的,不管对其有没有inline声明(关于这一点,请有经验的朋友指正)。

To gbunix
谢谢你纠正了我的错误认识。希望继续与你讨论问题。

论坛徽章:
0
7 [报告]
发表于 2004-03-12 09:51 |只看该作者

怎样将.o联编.C?

to lenovo:
    不可以的意思就是用g++去编译也是出错,至于为什么一个是gcc,一个是g++只是个人爱好,gcc能编译c++程序,但不能l链接c++程序,g++既可以编译c++又可以链接c++程序,所以我对没有main的c++喜欢用gcc,对于有main的用g++
    大写的后缀C使用为了表示这是个C++程序,这也是个人爱好,为了标识。还因为在有的系统小写的c被认为是C程序。
   对于我的代码,我表示抱歉。这是我粘贴过来的,没有编排一下。但我对你说的又长又乱,有异议,每个类成员和函数都很短,另外我问的是链接问题,这说明源码编译是没问题,所以函数实现代码就不用看了,不是编码实现的问题,你应该在什么会影响链接考虑问题。

to whyglinux
     非常感谢你的帮助,对inline 的使用我搞错了。
    但有一点我觉得你说错了。inline是可以对构造函数,operator等其他函数进行修饰的。在C++ primer 中文版110页有说明。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2004-03-12 10:02 |只看该作者

怎样将.o联编.C?

[应用程序Stringtest.c]
g++ -o Stringtest Stringtest.C stringClassTest.o
一个大写的C一个小写的c,
我想知道到底是哪一个?
btw,很抱歉,我对你的命名规则不是很习惯。我对c++文件
都是.cpp后缀。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP