[i=s] 本帖最后由 宣_仲达 于 2009-8-11 23:47 编辑 [/i]
第一节说:
(hello.c)
int main(int argc,char **argv)
{
printf("Hello Linux\n");
}
编译指令是:gcc -o hello hello.c
这里 hello是输出的可执行文件的名字,而hello.c是被编译的名字。
第二节有如下代码:
/* main.c */
#include "mytool1.h"
#include "mytool2.h"
int main(int argc,char **argv)
{
mytool1_print("hello");
mytool2_print("hello");
}
/* mytool1.h */
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif
/* mytool1.c */
#include "mytool1.h"
void mytool1_print(char *print_str)
{
printf("This is mytool1 print %s\n",print_str);
}
/* mytool2.h */
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif
/* mytool2.c */
#include "mytool2.h"
void mytool2_print(char *print_str)
{
printf("This is mytool2 print %s\n",print_str);
}
这个的编译指令是:
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
我不明白的是上面的指令当中,为什么没有输出文件名?为什么不是这样:
gcc -c main.o main.c
gcc -c main.o mytool1.c
gcc -c main.o mytool2.c
gcc -o main main.o mytool1.o mytool2.o


chenyangmvp163 于 2010-03-30 18:13:19发表:
每个都很牛
光脚赤膊 于 2010-01-17 02:11:43发表:
还是先看一下gcc 的参数说明吧
fz15004627 于 2009-08-12 16:08:21发表:
还是重新学习一下编程吧!
被置换的硫酸铜 于 2009-08-12 11:13:01发表:
高手很多,谢谢大家!我也懂了!同样谢谢楼主,发这么好的帖子!
宣_仲达 于 2009-08-12 00:45:05发表:
呵呵~~"默认会生成同名的obj文件即 mytool1.o了"就是我想要的。
hantu 于 2009-08-12 00:40:56发表:
gcc -c mytool1.c 此命令是编译mytool1.c ,但没再给出其它参数的情况下当然默认会生成同名的obj文件即 mytool1.o了
宣_仲达 于 2009-08-11 23:46:10发表:
哈哈,可以的哦!!,搞明白了。
宣_仲达 于 2009-08-11 23:44:15发表:
12# jinger7281
好,我现在就去式式
jinger7281 于 2009-08-11 17:18:38发表:
我好像看懂lz的意思了!能不能用不同文件名你可以自己尝试一下嘛!要是可以的话就链接通过了!
宣_仲达 于 2009-08-11 16:52:27发表:
如果可以不同名的话,那么下面这个命令合法么。
gcc -c abc.o mytool1.c
就是把mytool1。c文件编译生成一个名字为abc的目标代码文件?请问可以这样子么?
alick 于 2009-08-11 15:16:46发表:
默认是同名吧,这是gcc参数的语法问题,LZ可以瞧下gcc的man页
lemonade 于 2009-08-11 15:02:10发表:
谁告诉你必须同名了。。
被置换的硫酸铜 于 2009-08-11 14:28:04发表:
lz很强,这本书我也看过,但是没有在这地方作深入的考虑,lz这么一问倒还真是,我也不大都明白了。
我觉得是不是一种省略啊?还有就是会不会生成的.o文件会随着生成的可执行文件的出现而被删除啊?毕竟c中出现.o文件不是太正常!
宣_仲达 于 2009-08-11 13:25:49发表:
[i=s] 本帖最后由 宣_仲达 于 2009-8-11 13:29 编辑 [/i]
谢谢您的帮助,不过我想您误会我要问的问题了.
编译是指生成可被机器直接识别的目标代码文件,这个是机器代码或者汇编代码~~而可执行文件是目标代码文件加上启动代码和库例程后产生的可以直接运行的文件,这是很基础的东西...我想我的理解是没错的吧,
我想问的是,为什么生成的目标代码文件必需和.c 文件同名.
我为什么不是写出像这样的 :gcc -c mytool1.o(这里加上编译后生成的目标代码名?)mytool1.c
这里完全不考虑链接以及生成可执行代码的情况.
hantu 于 2009-08-11 01:23:26发表:
什么叫编译、什么叫链接请参看书中的内容。
hantu 于 2009-08-11 01:22:06发表:
书上没有说gcc的编译参数么?
第一节的编译命令 gcc -o hello hello.c 是从源码文件 hello.c 编译并链接生成可执行文件 hello 。
第二节的编译命令请注意! 参数是 -c , 只编译但不链接,
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
这三行命令分别编译后生成main.o 、mytool1.o 、mytool2.o 三个obj文件
gcc -o main main.o mytool1.o mytool2.o
这最后一行是链接三个obj文件生成main可执行文件。
这都是很基础的东西,要是不理解的话以后写makefile就更难了。
hantu 于 2009-08-11 01:21:44发表:
书上没有说gcc的编译参数么?
第一节的编译命令 gcc -o hello hello.c 是从源码文件 hello.c 编译并链接生成可执行文件 hello 。
第二节的编译命令请注意! 参数是 -c , 只编译但不链接,
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
这三行命令分别编译后生成main.o 、mytool1.o 、mytool2.o 三个obj文件
gcc -o main main.o mytool1.o mytool2.o
这最后一行是链接三个obj文件生成main可执行文件。
这都是很基础的东西,要是不理解的话以后写makefile就更难了。
宣_仲达 于 2009-08-10 23:51:41发表:
自己顶一下...呵呵
boats 于 2009-08-10 18:09:56发表:
这些书我直接就看不明白