问个问题:为什么生成不了lib文件
我建立的是win32动态链接库工作。以前做其他类也是这样写法没出现什么问题,这回的不知为什么只生成了dll,没有生成lib.求高人解答。 代码有点长,但主要是标出的部分需要指正,其他部分应该不用管这是头文件LinearArrH.h
#ifdef LINEAR_ARR
#else
#define LINEAR_ARR _declspec(dllimport)
#endif
#include<iostream>
#include<time.h>
const int MIN_SPAN=10;
template<typename T>
class LINEAR_ARR LinearArr
{
public:
LinearArr();
LinearArr(T h);
LinearArr(T*h,int number);
int GetSize();
int GetCapacity();
int Find(T element,int lo, int len);//从下标lo开始的len个元素中找到第一个指定元素并返回其秩,找不到时返回-1
void CapacityExpand();
void CapacityShrink();
void Pushback(T added);
void DeleteEnd();//只缩小size,并不释放空间
T DeleteElement(int n);//删除秩为n的元素
T GetFromIndex(int n);//返回秩为n的元素
//此处以成员方式重置两个运算符
T operator[](int n);//与GetFromIndex功能一样,但更为直观
LinearArr operator=(LinearArr<T>&la1);
//运算符重载完成
int DeleteByValue(T element,int lo,int len);//从下标lo开始的len个元素中删除所有值为element的元素
void Display();
int ClearArr();
void DeleteFixedLen(int beginner,int len);//删除从秩为beginner开始的len个元素
void Sort(bool downward=false);//参数为真降序排列,为假升序排列
bool IsSorted(bool direction=false);//参数为真检查是否降序,为假检查是否升序
void Shuffle(int lo,int len);//从标lo开始的len个元素随机重排
bool InsertAfter(T e,int n);//将新元素插入秩为n的元素之后,若n为-1则作为首元素插入
bool InsertBefore(T e,int n);//将新元素插入秩为n的元素之前,若n为0则作为首元素插入
void InsertInOrder(int lo,int hi,T element,bool downward=false);//从中分开,切分点归后一半
void MassAppend(T*array,int len);//将一个数组追加到原线性表后面
void MassAppend(LinearArr<T>la1);
int Deduplicate(int lo,int len);//将从下标为lo开始的len个元素中删去重复元素。注:只在区间内检查是否重复
friend LinearArr<T> operator+(const LinearArr<T>&la1,const LinearArr<T>&la2);
private:
T*head;
int size;
int capacity;
};
template<typename T>
LinearArr<T> operator+( LinearArr<T>&la1, LinearArr<T>&la2);
下面是cpp
#define LINEAR_ARR _declspec(dllexport)
#include"LinearArrH.h"
template<typename T>LinearArr<T>::LinearArr()
{
head=new T[capacity=MIN_SPAN];
size=0;
}
template<typename T>LinearArr<T>::LinearArr(T h)
{
head=new T[capacity=MIN_SPAN];head[0]=h;size=1;
}
template<typename T>LinearArr<T>::LinearArr(T*h,int number)
{
head=new T[capacity=(number>MIN_SPAN?number*2:MIN_SPAN)];
for(int i=0;i<number;i++)
head[i]=h[i];
size=number;
}
template<typename T>int LinearArr<T>::GetSize(){return size;}
template<typename T>int LinearArr<T>::GetCapacity(){return capacity;}
template<typename T>void LinearArr<T>::CapacityExpand()
{
//cout<<"size:"<<size<<"; capacity:"<<capacity<<endl;
if(size<<1<capacity) return;
T*p=head;
head=new T[capacity=capacity<<1];
for(int i=0;i<size;i++)
head[i]=p[i];
delete p;
//cout<<"capacity:"<<capacity<<endl;
}
template<typename T>void LinearArr<T>::CapacityShrink()
{
if(size<<2>=capacity||capacity<=MIN_SPAN) return;
T*oldArr=head;
head=new T(capacity>>=1);
for(int i=0;i<size;i++) head[i]=oldArr[i];
delete oldArr;
}
template<typename T>void LinearArr<T>::Pushback(T added)
{
if(capacity==size)
CapacityExpand();
head[size++]=added;
}
template<typename T>void LinearArr<T>::DeleteEnd()
{
size--;//减少长度,其实并不释放存储空间
CapacityShrink();//如果需要释放存储空间的话则释放
}
template<typename T>T LinearArr<T>::DeleteElement(int n)//删除秩为n的元素
{
int deleted=head[n];
for(int i=n;i<size;i++)
head[i]=head[i+1];
size--;
CapacityShrink();
return deleted;
}
template<typename T>T LinearArr<T>::GetFromIndex(int n){return (n>=0&&n<size)?head[n]:NULL;}
template<typename T>T LinearArr<T>::operator[](int n){return (n>=0&&n<size)?head[n]:NULL;}
template<typename T>LinearArr<T> LinearArr<T>::operator=(LinearArr<T>&la1)
{
ClearArr();capacity=la1.GetCapacity();size=la1.GetSize();
for(int i=0;i<size;i++) head[i]=la1.GetFromIndex(i);
return *this;//给个返回值可支持连续赋值
}
template<typename T>void LinearArr<T>::Display()
{
for(int i=0;i<size;i++)
cout<<head[i]<<" ";
}
template<typename T>int LinearArr<T>::ClearArr()
{
int oldSize=size;
delete head;head=new T[MIN_SPAN];//勿忘重新分配空间,否则无法添加新元素。
size=0;capacity=MIN_SPAN;
return oldSize;
}
template<typename T>void LinearArr<T>::DeleteFixedLen(int beginner,int len)//删除从秩为beginner开始的len个元素
{
if(beginner+len>=size) size=beginner+1;
else
{
for(int i=beginner+len;i<size;i++)
head[beginner++]=head[i];
size-=len;
}
CapacityShrink();
}
template<typename T>int LinearArr<T>::DeleteByValue(T element,int lo,int len)
{
if(lo<0||lo>size-1) return 0;
if(lo+len>size) len=size-lo;
int oldSize=size;
for(int i=lo;i<lo+len;i++)
if(head[i]==element)
{
DeleteElement(i);len--;
}
return oldSize-size;
}
template<typename T>void LinearArr<T>::Sort(bool downward)//参数为真降序排列,为假升序排列
{
int idx;T temp;int scope=size;
if(downward)//降序排列
{
while(--scope)
{
for(idx=0;idx<scope;idx++)
{
if(head[idx]<head[idx+1])
{
temp=head[idx];head[idx]=head[idx+1];head[idx+1]=temp;
}
}
}
}
else//升序排列
{
while(--scope)
{
for(idx=0;idx<scope;idx++)
{
if(head[idx]>head[idx+1])
{
temp=head[idx];head[idx]=head[idx+1];head[idx+1]=temp;
}
}
}
}
}
template<typename T>bool LinearArr<T>::IsSorted(bool direction)//参数为真检查是否降序,为假检查是否升序
{
int i;
if(direction)
{
for(i=0;i<size-1;i++)
{
if(head[i]<head[i+1])
return false;
}
return true;
}
else
{
for(i=0;i<size-1;i++)
{
if(head[i]>head[i+1])
return false;
}
return true;
}
}
template<typename T>void LinearArr<T>::Shuffle(int lo,int len)
{
if(size<=1||lo+len>size) return;
srand((unsigned int)time(0));
int rd;T tmp;
for(int i=lo;i<lo+len;i++)
{
rd=lo+rand()%len;
tmp=head[i];head[i]=head[rd];head[rd]=tmp;
}
}
template<typename T>bool LinearArr<T>::InsertAfter(T e,int n)//将新元素插入秩为n的元素之后,若n为-1则作为首元素插入
{
if(n>=size||n<-1) return false;
if(size==capacity) CapacityExpand();
for(int i=size++;i>n;i--)
head[i+1]=head[i];
head[n+1]=e;
return true;
}
template<typename T>bool LinearArr<T>::InsertBefore(T e,int n)//将新元素插入秩为n的元素之前,若n为0则作为首元素插入
{
if(n>=size||n<0) return false;
if(size==capacity) CapacityExpand();
for(int i=size++;i>=n;i--)
head[i+1]=head[i];
head[n]=e;
return true;
}
template<typename T>void LinearArr<T>::InsertInOrder(int lo,int hi,T element,bool downward)//从中分开,切分点归后一半
{
if(lo==hi)
{
if(size++==capacity) CapacityExpand();
int i;
if(downward==(element>=head[lo]))
{
for(i=size-1;i>=lo;i--)
head[i+1]=head[i];
head[lo]=element;
}
else
{
for(i=size-1;i>=lo+1;i--)
head[i+1]=head[i];
head[lo+1]=element;
}
return;
}
if(downward)
{
if(element>head[(lo+hi)>>1])
{
InsertInOrder(lo,(lo+hi)>>1,element,downward);
}
else
{
InsertInOrder(((lo+hi)>>1)+1,hi,element,downward);
}
}
else
{
if(element<head[(lo+hi)>>1])
{
InsertInOrder(lo,(lo+hi)>>1,element,downward);
}
else
{
InsertInOrder(((lo+hi)>>1)+1,hi,element,downward);//要加括号,因为加号优先级高于位右移
}
}
}
template<typename T>void LinearArr<T>::MassAppend(T*array,int len)
{
if(size+len>capacity) CapacityExpand();
for(int i=0;i<len;i++)
head[size++]=array[i];
}
template<typename T>void LinearArr<T>::MassAppend(LinearArr<T>la1)
{
if(size+la1.GetSize()>capacity) CapacityExpand();
for(int i=0;i<la1.GetSize();i++)
head[size++]=la1.GetFromIndex(i);
}
template<typename T>int LinearArr<T>::Find(T element,int lo,int len)
{
while(len--)
if(head[lo++]==element) return lo-1;
return -1;
}
template<typename T>int LinearArr<T>::Deduplicate(int lo,int len)
{
if(len<=1) return 0;
if(lo+len>size) len=size-lo;//长度不允许超出表尾
int oldSize=size;//记录原来的元素个数,用于计算被删除的元素个数并返回
int hi=lo+len;//求指定区间末元素的下一元素的下标。注:不是末尾自身的下标!
for(int i=lo+1;i<hi;)
{
if(Find(head[i],lo,i-lo)==-1) i++;
else
{
DeleteElement(i);hi--;
}
}
return oldSize-size;
}
template<typename T>LinearArr<T> operator+( LinearArr<T>&la1, LinearArr<T>&la2)
{
LinearArr<T> la3;
if(la1.GetSize()+la2.GetSize()>MIN_SPAN) la3.CapacityExpand();
for(int i=0;i<la1.GetSize();i++) la3.Pushback(la1.GetFromIndex(i));
for(i=0;i<la2.GetSize();i++) la3.Pushback(la2.GetFromIndex(i));
return la3;
}