GCC编译链接多文件

gcc是Linux/Unix上非常强大的C语言编译器。并且如今也支持C++的编译。与VC不同,gcc是完全跨平台的。到目前为止很多工具都使用gcc作为其编译环境,比如cocos2d-x,android的NDK等等。 学习使用gcc编译器,就是学习它众多的编译参数。就是用连字符-连接的参数.
因为它的参数并不全是单字符的,所以不能使用一个连字符后加多个参数的写法, 要每个参数前面都要加一个连字符.

常用用法

直接在gcc后面加上要编译的C语言源文件
gcc hello.c
这种默认的情况下会生成一个名为a.out的可执行文件。
-o 最常用的编译选项,用于指定要生成的可执行文件的名称。
gcc -o hello hello.c
需要体会的一点是:gcc对于参数的位置无要求!比如也可以写作
gcc hello.c -o hello
惟一要注意的就是-o后面一定要紧跟要生成的可执行文件名。
-g 用于给生成的可执行文件加上调试信息,只有这样才可使用gdb调试。
gcc -g -o hello hello.c
同样参数-g的也可写在hello.c后面。

-D选项
参考如下代码great.c

#include <stdio.h>
int main(int argc, char *argv[])
{
#ifdef MYDEBUG
    printf("test\n");
#endif
    printf("hello world\n");

    return 0;
}

如果我想要让程序打印test,测试该分支运行情况可以用如下命令:
gcc -DMYDEBUG -g -o great great.c
./great
如果直接
gcc -o great great.c
./great
程序执行结果:

通过使用—D选项可以测试程序分支的正确与否,验证程序的逻辑正确性.

华丽的分割线

选项 -E
gcc -E test.c -o test.i 将test.c预处理输出test.i文件。
选项 -S
gcc -S test.i 将预处理输出文件test.i汇编成test.s文件。
选项 -c
gcc -c test.s 将汇编输出文件test.s编译输出test.o文件。

多文件编译与Makefile

1.多个文件一起编译
用法:gcc a.c b.c c.c d.c -o main
作用:将多个.c文件编译后链接成可执行文件 ./main执行
2.单独编译各个源文件,然后对编译后的.o文件进行链接
gcc -c a.c //生成a.o
gcc -c b.c //生成b.o
gcc -c c.c //生成d.o
gcc -c d.c //生成d.o
例子:
display.c

#include <stdio.h>
void display(const char *str)
{
    printf("hello world :%s.\n",str);
}

main.c

#include <stdio.h>
extern func();
int main()
{
    display("52coder");
    return 0;
}

关于在main.c中extern func()是告诉编译器func()声明在别的文件,如果不加这一行的话会有如下告警:
main.c:5:5: warning: implicit declaration of function ‘display’ [-Wimplicit-function-declaration]

使用c99标准编译 默认的情况下,编译器是以c89的标准编译的。使用c99则:
gcc -std=c99 hello.c

使用 GCC 编译多文件程序和头文件涉及以下几个步骤: 1. **组织文件结构**: - 将相关的源代码文件 (.c) 分别放在各自的文件夹中,比如有一个 `main.cpp`, `header1.h`, 和 `header2.h`。 - 将公共头文件(通常包含了函数声明或宏定义)放在一起,例如在 `include` 文件夹下。 2. **头文件包含**: - 在每个源文件中(除了那些不需要头文件的),使用 `#include` 指定对应的头文件,例如 `#include "header1.h"`。 3. **编译文件**: - 对于每个源文件,单独编译它。假设你有三个源文件,分别编译为三个.o 文件- `gcc main.cpp -c -o main.o` - `gcc header1.cpp -c -o header1.o` - `gcc header2.cpp -c -o header2.o` 4. **链接生成可执行文件**: - 使用 `gcc` 连接所有 .o 文件并生成可执行文件- 如果你的 `main.cpp` 包含了其他.o 文件,那么: ``` gcc main.o header1.o header2.o -o your_program ``` `-o` 参数指定了最终的可执行文件名。 5. **使用预处理指令**: - 如果头文件包含条件编译或者其他预处理指令,你可能需要使用 `-E` 或 `-P` 选项来编译仅提取预处理信息。 6. **添加包含路径**: - 如果头文件不是在当前目录下,可以使用 `-I` 选项添加包含路径,如 `-I include`。 **注意事项**: - 保证所有的源文件都被正确的编译并且链接到了一起,特别是当有循环依赖时需要特别注意。 - 如果你在编写 C++ 项目,还需要考虑链接库 (-l flag) 和链接器选项 (-L flag),特别是动态链接库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值