基础问题 .

软件和网站开发以及相关技术探讨
回复
tiankunmin
帖子: 38
注册时间: 2007-09-07 3:08

基础问题 .

#1

帖子 tiankunmin » 2007-09-08 18:41

a.cpp

代码: 全选

#include <iostream>
#include "b.h"

int main()
{
   int i = add(5, 3);
   printf("%d\r\n", i);
   return 0;
}
b.h

代码: 全选

#ifndef B_H
#define B_H

int add(const int a, const int b);
#endif
b.cpp

代码: 全选

#include "b.h"
int add(const int a, const int b)
{
   return a + b;
}
我用gcc -o ~/a ~/a.cpp

提示说没有定义add(int, int)
怎么会事,不好意思这个问题实在太愚蠢了,对于刚刚入门linux编程的习惯了windows下vs的ide环境的人
还是有写不解! :( :( :(
上次由 tiankunmin 在 2007-09-08 19:59,总共编辑 1 次。
头像
stlxv
论坛版主
帖子: 8275
注册时间: 2006-05-03 0:39
来自: المريخ

#2

帖子 stlxv » 2007-09-08 19:13

b.h写错了
PHP是最好的语言!不服来战!
头像
stlxv
论坛版主
帖子: 8275
注册时间: 2006-05-03 0:39
来自: المريخ

#3

帖子 stlxv » 2007-09-08 19:13

a.cpp也错了
PHP是最好的语言!不服来战!
头像
stlxv
论坛版主
帖子: 8275
注册时间: 2006-05-03 0:39
来自: المريخ

#4

帖子 stlxv » 2007-09-08 19:14

编译时用的命令也错了
PHP是最好的语言!不服来战!
头像
stlxv
论坛版主
帖子: 8275
注册时间: 2006-05-03 0:39
来自: المريخ

#5

帖子 stlxv » 2007-09-08 19:15

怎么会事,不好意思这个问题实在太愚蠢了,对于刚刚入门linux编程的习惯了windows下vs的ide环境的人
先自己检查一下程序,你的这个程序在vs中同样编译不过的
PHP是最好的语言!不服来战!
头像
stlxv
论坛版主
帖子: 8275
注册时间: 2006-05-03 0:39
来自: المريخ

#6

帖子 stlxv » 2007-09-08 19:26

改好的见附件
附件
tiankunmin_problem.tar.gz
(4.69 KiB) 已下载 40 次
PHP是最好的语言!不服来战!
tiankunmin
帖子: 38
注册时间: 2007-09-07 3:08

#7

帖子 tiankunmin » 2007-09-08 20:03

谢谢stlxv
不过我还是有些不解.
我怎么都没看出我哪里写错了在 a.cpp 和b.h 你的附件我 用
b.h中的#infndef 写错了那是抄上来的时候抄错的,源程序里没错.刚才我编辑了下
把#infndef改成了#ifndef
g++ -o ~/Desktop/tiankunmin_problem/a ~/Desktop/tiankunmin_problem/a.cpp 也编译不了提示同样的错误

看来是这句g++编译语句用问题.请问怎么不使用makefile该如何写这个编译语句.
上次由 tiankunmin 在 2007-09-09 0:15,总共编辑 1 次。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#8

帖子 BigSnake.NET » 2007-09-08 20:29

g++ -o ~/Desktop/tiankunmin_problem/a ~/Desktop/tiankunmin_problem/a.cpp ~/Desktop/tiankunmin_problem/b.cpp
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
tiankunmin
帖子: 38
注册时间: 2007-09-07 3:08

#9

帖子 tiankunmin » 2007-09-08 20:32

发现把#include "b.h"改成#include "b.cpp"就行了.
我这样理解不知道对不对,g++不会根据b.h去找b.cpp
但是b.cpp 包含了 b.h 所以#include "b.cpp"即可
在你给的makefile中也是用b.cpp而不是b.h
难道linux没有文件后缀的概念?
tiankunmin
帖子: 38
注册时间: 2007-09-07 3:08

#10

帖子 tiankunmin » 2007-09-08 21:16

BigSnake.NET 写了:g++ -o ~/Desktop/tiankunmin_problem/a ~/Desktop/tiankunmin_problem/a.cpp ~/Desktop/tiankunmin_problem/b.cpp
谢谢8楼的大哥,不过这也太恐怖了 我 还是写makefile吧 :shock:
头像
stlxv
论坛版主
帖子: 8275
注册时间: 2006-05-03 0:39
来自: المريخ

#11

帖子 stlxv » 2007-09-09 0:25

关于编译:
你直接执行

代码: 全选

make
就知道怎样的编译命令才是对的。
不过执行之前最好先执行

代码: 全选

make clean
上次由 stlxv 在 2007-09-09 0:34,总共编辑 1 次。
PHP是最好的语言!不服来战!
头像
stlxv
论坛版主
帖子: 8275
注册时间: 2006-05-03 0:39
来自: المريخ

#12

帖子 stlxv » 2007-09-09 0:32

tiankunmin 写了:发现把#include "b.h"改成#include "b.cpp"就行了.
我这样理解不知道对不对,g++不会根据b.h去找b.cpp
但是b.cpp 包含了 b.h 所以#include "b.cpp"即可
在你给的makefile中也是用b.cpp而不是b.h
难道linux没有文件后缀的概念?
b.h改成b.cpp意义就完全变了。
g++当然不会根据b.h去找b.cpp,而且任何c++编译器都不会这么做,除非你在源代码中包含了b.cpp。#include的作用只是仅仅把文件内容包含进当前文件而已。你的b.h作用只在于告诉编译器有那个用来做加法的函数。当a.cpp和b.cpp都分别编译完成之后,再进行连接成可执行文件a。
linux没有扩展名的概念,但是后缀和扩展名不是同样一个概念。你重新执行一下make clean all,看看我的编译过程是怎样的:先单独编译a.cpp和b.cpp,然后再把编译好的两个文件连接起来成最终的可执行文件(任何其他正统的c++编译器都是这么做的)。
你的程序还有另外的问题,你包含了iostream,但是你没用到,当然这不算错误;你使用了printf,却没有包含stdio.h,那么你这时使用的printf是编译器内嵌的printf函数,而不是正规的printf函数了。
PHP是最好的语言!不服来战!
tiankunmin
帖子: 38
注册时间: 2007-09-07 3:08

#13

帖子 tiankunmin » 2007-09-09 2:06

哦 恍然大悟 多谢 stlxv!
头像
stlxv
论坛版主
帖子: 8275
注册时间: 2006-05-03 0:39
来自: المريخ

#14

帖子 stlxv » 2007-09-09 12:02

不客气
PHP是最好的语言!不服来战!
回复