Linux环境下编写C程序

一:gcc编译链接
用法:gcc [选项] 文件...
选项:
-pass-exit-codes 在某一阶段退出时返回最高的错误码
--help 显示此帮助说明
--target-help 显示目标机器特定的命令行选项
--help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]
显示特定类型的命令行选项
(使用‘-v --help’显示子进程的命令行参数)
--version 显示编译器版本信息
-dumpspecs 显示所有内建 spec 字符串
-dumpversion 显示编译器的版本号
-dumpmachine 显示编译器的目标处理器
-print-search-dirs 显示编译器的搜索路径
-print-libgcc-file-name 显示编译器伴随库的名称
-print-file-name=<库> 显示 <库> 的完整路径
-print-prog-name=<程序> 显示编译器组件 <程序> 的完整路径
-print-multiarch Display the target‘s normalized GNU triplet, used as
a component in the library path
-print-multi-directory 显示不同版本 libgcc 的根目录
-print-multi-lib 显示命令行选项和多个版本库搜索路径间的映射
-print-multi-os-directory 显示操作系统库的相对路径
-print-sysroot 显示目标库目录
-print-sysroot-headers-suffix 显示用于寻找头文件的 sysroot 后缀
-Wa,<选项> 将逗号分隔的 <选项> 传递给汇编器
-Wp,<选项> 将逗号分隔的 <选项> 传递给预处理器
-Wl,<选项> 将逗号分隔的 <选项> 传递给链接器
-Xassembler <参数> 将 <参数> 传递给汇编器
-Xpreprocessor <参数> 将 <参数> 传递给预处理器
-Xlinker <参数> 将 <参数> 传递给链接器
-save-temps 不删除中间文件
-save-temps=<arg> 不删除中间文件
-no-canonical-prefixes 生成其他 gcc 组件的相对路径时不生成规范化的
前缀
-pipe 使用管道代替临时文件
-time 为每个子进程计时
-specs=<文件> 用 <文件> 的内容覆盖内建的 specs 文件
-std=<标准> 指定输入源文件遵循的标准
--sysroot=<目录> 将 <目录> 作为头文件和库文件的根目录
-B <目录> 将 <目录> 添加到编译器的搜索路径中
-v 显示编译器调用的程序
-### 与 -v 类似,但选项被引号括住,并且不执行命令
-E 仅作预处理,不进行编译、汇编和链接
-S 编译到汇编语言,不进行汇编和链接
-c 编译、汇编到目标代码,不进行链接
可以对单个文件只编译,避免程序出错
-o <文件> 输出到 <文件>

-pie Create a position independent executable
-shared Create a shared library
-x <语言> 指定其后输入文件的语言
允许的语言包括:c c++ assembler none
‘none’意味着恢复默认行为,即根据文件的扩展名猜测
源文件的语言

gcc + 文件名  默认生成a.out可执行文件

以 -g、-f、-m、-O、-W 或 --param 开头的选项将由 gcc 自动传递给其调用的
不同子进程。若要向这些进程传递其他选项,必须使用 -W<字母> 选项。

二. ./[可执行文件] 执行程序
./指当前目录,./ 文件指执行当前目录下文件 。/a.out 表示执行a.out可执行文件

三. gdb调试
1.输入file 文件,表示gdb调试的对象;
2.输入l,显示出程序的代码;
3.输入b n(数字) 表示设置的断点位置;
4.输入r表示调试开始;
5.输入s或n(字母)表示进入下一步;
6.输入p 变量名可查看该变量的数值;
7.输入q 退出gdb调试。

四.编写简单的不包括头文件的程序
以编写helloworld程序为例。
1.用ctrl+alt+T来打开终端
2.要在某个文件夹里创建文本,首先要回到该文件夹的目录。如我在桌面(desktop)建立文本。 (在终端中输入)
cd Desktop //然后按下回车
3.创建文件夹(此步骤可跳过,但建议创建)
mkdir 文件名
4.建立文本
gedit hello world.c //然后按下回车,会跳出一个类似于windows的记事本
5.往里面敲代码
C

include <stdio.h>

int main(void) {
printf("hello world!");
return 0;
} 

6.保存代码,关闭文本框。
按esc,再输入:wq(一开始看不到尽管输进去,wq为保存并关闭,也可为w则为保存不关闭)
7.启动gcc对代码进行编译。
gcc helloworld.c -o execFile(此步骤会生成一个execFlie的文件,可用ls查看)
8.如果有错误,系统会提示,按方向键找回gedit helloworld.c 的指令,按下回车,弹出文本框后根据系统提示对代码进行修改,完成后记得保存,
关闭文本框。
9.运行
./execFlie则会开始运行
7.如果要进行调试,请参考我的第三部分:“有关编写C语言的指令”。

五.编写包括头文件的程序
如://test.h

#ifndef TEST_H
#define
TESH_H

void print();
#endif

//test.c
#include<stdio.h>
#include"test.h"
void print()
{printf("this is ja test\n");}

//main.c
#include"test.h"
int main()
{print();return 0;
}
如果只编译main.c就会出现“函数未定义”的错误,这是编译不完整的原因,所以无法链接到所需要的函数。

真确的编译方法如下:
gcc -c main.c # -c参数的作用是让gcc只编译,不链接
gcc -c test.c
gcc -o main main.o test.o # 将编译好的目标代码链接

原文地址:http://blog.51cto.com/12656963/2073216

时间: 2024-11-05 18:43:54

Linux环境下编写C程序的相关文章

Ubantu Linux 环境下编译c++程序

先在文件中新建一个a.cpp文件,在里面编写程序, 然后打开终端输入下面命令即可; $ g++ a.cpp -o b ///编译a.cpp 然后把编译之后的.exe文件存入b中 $ ./b ///执行当前目录下的b,就是运行程序的意思; 这是简单的编译运行,接着就是调试了(个人建议直接用输出对应变量的方法比较好),下面记录一些基本命令 $ g++ a.cpp -o b -g /// $ gdb /// $ file b ///对应文件b $ l ///查看b中的内容, l(list); $ b

linux 环境下编写的代码在windows平台编译时大面积报错

跨平台工程往往因为换行符的不一样导致编译时出现一些莫名其妙的错误, 可以通过file查看文件格式,通过unix2dos.unix2mac.dos2unix.mac2unix等命令将格式转换下,windows平台也可以设置git config --global core.autocrlf true(如果只是windows项目则设置成false以把回车符也提交),linux和mac平台则设置git config --global core.autocrlf input 原文地址:https://ww

在linux环境下编译C++ 程序

单个源文件生成可执行程序 下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: 单个源文件生成可执行程序 /* helloworld.cpp */ #include <iostream> int main(int argc,char *argv[]) { std::cout << "hello, world" << std::endl; return(0); } 程序使用定义在头文件 iostream 中的 cout

每天一点GO语言——Linux环境下安装Go语言环境以及编写Go语言程序初体验

每天一点GO语言--Linux环境下安装Go语言环境以及编写Go语言程序初体验 一.安装Go语言环境 [[email protected] opt]# yum -y install wget git [[email protected] opt]# wget -c https://studygolang.com/dl/golang/go1.10.3.linux-amd64.tar.gz [[email protected] opt]# tar -zxvf go1.10.3.linux-amd64

Linux环境下使用eclipse开发C++动态链接库程序

Linux中也有类似windows中DLL的变成方法,只不过名称不同而已.在Linux中,动态链接叫做Standard Object,生成的动态链接文件为*.so.详细请参考相关文档. 开发环境:Eclipse 3.4.2 G++:4.3.2 1. 创建动态链接库 (1)在Eclipse中创建新的C++工程 File->New->Project->C++->C++ Project,选择Shared Library. (2)创建源代码文件 File->New->Sourc

Linux环境下部署完JDK后运行一个简单的Java程序

前言 前一篇文章详细讲解了如何在Windows环境下安装虚拟机+Linux系统,并且成功部署了JDK. 不过部署完JDK之后,我们判断部署是否成功的依据是看"java -version"命令是否有正确的内容打印,也许这并不具备太大的说服力.可能能够运行起一个正确的java程序来,不管从感性角度还是理性角度来说,都会有一个更好的认识. 所以本文写一段很简单的java代码,并且在Linux环境下编译运行,以证明JDK部署得确实没有问题. 代码验证JDK部署是否正确 1.级联建立两个目录 首

在linux环境下编译运行OpenCV程序的两种方法

原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了. 在谷歌和上StackOverFlow查看相关问题解答之后,我下面就介绍Command Line和CMake两种方式. 首先我先粘上我测试的代码吧,文件名为Test.c 1 #include <highgui.h> 2 3 int main(int argc,char ** argv) { 4 5 IplImage* img = cvLoadImage

windows下编写的bash脚本拖入linux环境下脚本出错之编码问题

windows下编写的bash脚本拖入linux环境下脚本出错之编码问题         脚本经常在windows下写好,拖入到linux环境中运行.但是在运行过程中,经常出现编码问题,这里记录一下.方便自己日后查看,或者给刚好遇到这样的问题的同学一个尝试的方法. 在linux环境下vim 进入拖入的bash脚本.执行命令 :set ff=unix

针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案

基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调试,从而获得程序运行状态下的信息( 关闭 ALSR 机制 ),基础的 gdb 操作可参见笔者的文章Linux下编辑.编译.调试命令总结--gcc和gdb描述.使用 gdb 可以方便的获取程序动态运行状态下的信息,但通过 gdb 动态调试获取的诸如缓冲区的起始地址等信息可能与程序实际运行时的信息并不相