Chinaunix首页 | 论坛 | 博客
  • 博客访问: 89372
  • 博文数量: 22
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 505
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-21 17:13
文章分类

全部博文(22)

文章存档

2011年(1)

2008年(21)

我的朋友

分类: C/C++

2008-06-11 13:00:10

看到这个任务先是一头雾水,还真没在Linux下开发过,只做过小实验。首先想到的是那个makefile咋整。首先学习了一下makefile文件。看了那篇 跟我一起写makefile: http://dev.csdn.net/develop/article/20/20025.shtm 得出的结论是makefile就是编译的规则。意即:目标文件需要依赖哪些中间目标文件(.o),而中间目标文件需要依赖哪些源文件(.c)
 
我用到的makefile是这样的:
# C++ compiler
CC = g++
CFLAGS = -Wall -O2 -g     #编译器的设置
 
# Libraries to link.
LIBFLAGS = -lm  -L/u/vega3/lib
INCDIR = -I./include -I/u/vega3/lib/g++-include
INC = ./include          #要用到的libraries
 
#Defines              
DEFINES = -DGCC
ENCODE = -DENCODER -DNONE
DECODE = -DDECODER -DNONE
SRCDIR = ./src           #只是一些定义,即一些代号,方便下面用到
 
# All object files to link.     #规则
OBJDIR = ./obj
COBJ = $(OBJDIR)/general.o $(OBJDIR)/aritcode.o $(OBJDIR)/image_bw.o \
 $(OBJDIR)/encode.o
DOBJ = $(OBJDIR)/general.o $(OBJDIR)/aritcode.o $(OBJDIR)/image_bw.o \
 $(OBJDIR)/decode.o             #又是一些定义,方便下面使用
 
decp :  $(COBJ)
 $(CC) -O2 $(DEFINES) $(CFLAGS) $(INCDIR) -o decp $(COBJ) \
        $(LIBFLAGS)             #目标是decp,依赖于COBJ
recv : $(DOBJ)
 $(CC) -O2 $(DEFINES) $(CFLAGS) $(INCDIR) -o recv $(DOBJ) \
        $(LIBFLAGS)             #目标是recv,依赖于DOBJ
 
$(OBJDIR)/encode.o: $(SRCDIR)/codetree.cc
 $(CC) $(CFLAGS) $(ENCODE) $(INCDIR) -c $(SRCDIR)/codetree.cc -o $@
$(OBJDIR)/decode.o: $(SRCDIR)/codetree.cc
 $(CC) $(CFLAGS) $(DECODE) $(INCDIR) -c $(SRCDIR)/codetree.cc -o $@
$(OBJDIR)/image_bw.o: $(INC)/image_bw.h $(INC)/dwt.h $(SRCDIR)/image_bw.cc
 $(CC) $(CFLAGS) -DNONE $(INCDIR) -c $(SRCDIR)/image_bw.cc -o $@
$(OBJDIR)/%.o : $(SRCDIR)/%.cc
 $(CC) $(DEFINES) $(CFLAGS) -c $(INCDIR) $< -o $@
                    #COBJ和DOBJ中那些.o文件是怎样生成的,即中间目标文件需要依赖哪些源文件(.c)
 
clean :    # make clean的规则,此处未定义
 
大概明白了,生成了两个目标。那在Windows的vs.net下怎么能生成两个目标呢?
 
 
先新建了project,把Linux下的源代码拷进去了。先把遇到的几个语法错误解决:

1)在.Net, #include "iostream.h" 应改成:

#include

using namespace std;

 

21>..\..\Li\2d\src\codetree.cc(86) : error C2668: 'pow' : ambiguous call to overloaded function

在把参数转为float或其他认可的即可
 

3

1>..\..\Li\2d\src\codetree.cc(299) : error C2065: 't' : undeclared identifier

1>..\..\Li\2d\src\codetree.cc(299) : error C2065: 'ht2' : undeclared identifier

1>..\..\Li\2d\src\codetree.cc(299) : error C2065: 'ht1' : undeclared identifier

只是因为这三个变量在

#ifdef DECODER

  double t, ht1, ht2;

#endif

语句中定义。

 

这不正是两个目标的原因吗。因此代码也分为两部分,DECODER是一部分,ENCODER是一部分。#ifdef是条件编译,想在Linux下也只要在运行的时候加上DECODER的参数就行吧,在vs 2005中怎么设?问了高手得知:

要在projectproperties中设置:

Project -> properties -> C/C++ -> preprocessor -> preprocessor definitions 中填上条件编译的ENCODER DECODER

makefile中的两个目标的问题就解决了。

 

4)debug的时候,还有个问题,No symbols loaded.的错误。类似:

'。。。.exe': Loaded 'C:\Book\CANDemo\Release\CANDemo.exe', No symbols loaded.
'。。。.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', No symbols loaded.
'。。。.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', No symbols loaded.
'。。。.exe': Loaded 'C:\WINDOWS\system32\user32.dll', No symbols loaded.
'。。。.exe': Loaded 'C:\WINDOWS\system32\gdi32.dll', No symbols loaded.
'。。。.exe': Loaded 'C:\WINDOWS\system32\uxtheme.dll', No symbols loaded.
。。。.exe': Loaded 'C:\WINDOWS\system32\msvcrt.dll', No symbols loaded.

。。。。。

 

搜索到这样一篇http://www.gamedev.net/community/forums/topic.asp?topic_id=390577很有用

原因:在dll中,debugging symbols没法加载进来。

解决方法:

 

5)可以debug了,debug的时候怎么填写cmd中需要运行的arguments

Project -> properties -> debugging -> command arguments中填写除命令(.exe)以外的参数。

 

6)d:\project\li\2d\src\../include/dwt.h(94) : error C2440: 'initializing' : cannot convert from 'double [20][20]' to 'double'

原因:c++中的数组不能互相赋值,因为数组名是常量。而在g++中可以编译通过。

方法一:for循环一个个赋值

方法二:用memcpy,加#include 头文件.但第二个数组要用指针。

#include

#include

void main()

{

         int array[2][2]= {{1},{2}};

         int * parray2 = new int [4];   

         memcpy(parray2, &array[0][0], 2*2*sizeof(int));    // 注意此处用2*2*sizeof(int),而非2×2

         cout<<*parray2<<"   " <<*(parray2+1)<< "  "<<*(parray2+2)<<"  "<<*(parray2+3)<

}

#include

#include

void main()

{

         int array[2][2]= {{1},{2}};

         int (*parray2)[2];

         parray2 = new int[2][2];   // 参见

 

         memcpy(parray2, &array[0][0], 2*2*sizeof(int));

         cout<< parray2[0][0]<< parray2[0][1]<< parray2[1][0]<

}

 

注意:

cout<<"array address"<<&array[0][0]<<"  "<<&array[0][1]<<"  "<<&array[1][0]<<"  "<<&array[1][1]< 

cout<< array <<"  "<< (array + 1)<<"  "<< (array + 2)<<"  "<<(array + 3)<是不同的

原因:array是二维数组,array + 1是第二行的地址,array + 2是第三行地址。。。。

正确应该是 *(array+a) +b 即为第(a+1)行,(b+1)列的元素。

 

 

7)因此该数组的赋值要用for或memcpy,而为规范(可能文件多了链接也会有问题)头文件中只能有函数声明,不能定义、调用普通函数。可定义内联函数。可定义常量,不能定义变量。不能实例对象。可定义宏。可定义static

 

 
 
 
 
 
阅读(1629) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~