分页: 1 / 1

怎么把自己的头文件加入系统目录/usr/include

发表于 : 2012-08-27 0:08
unreal
俺第N次决定学习C语言,在OpenBSD上可是第一次噢~
把教材里的例程需要的头文件拷贝到 /usr/include
#cp genlib.h /usr/include
#ldconfig -m /usr/include
$cc hello.c -o hello
hello.c:2:20: error: genlib.h: No such file or directory
放到/usr/include/mylib 再 ldconfig -m /usr/include/mylib 也不行.
是 ldconfig 用得不对?还是系统安全机制 /usr/include 根本不接受外来的文件?
肯请高手不吝赐教!

回复: 怎么把自己的头文件加入系统目录/usr/include

发表于 : 2012-08-27 14:43
junfengfan
其实我也想在openbsd里面装上gcc,然后运行C语言,把大学里的C语言课程里面的程序一一的再运行一次,也遇到各种各种的问题,比如math.h 这个头文件是可以到 网上下载的吗?还是只要装gcc后,openbsd系统就有这个头文件……

回复: 怎么把自己的头文件加入系统目录/usr/include

发表于 : 2012-08-27 21:00
unreal
junfengfan 写了:其实我也想在openbsd里面装上gcc,然后运行C语言,把大学里的C语言课程里面的程序一一的再运行一次,也遇到各种各种的问题,比如math.h 这个头文件是可以到 网上下载的吗?还是只要装gcc后,openbsd系统就有这个头文件……
现在*BSD 里的 cc 就是 gcc,因为gcc 从4.2.1 之后换了GPLv3协议,与BSD协议冲突,所以base里都是 4.2.1 版本,更高的版本可从pkg安装。我觉得学习的话用4.2.1足够了。另外pkg里也有BSD协议的C编译器 clang 可用。据称 FreeBSD 10 将把 clang 作为默认的 C/C++ 编译器,不再使用 gcc 。

UNIX 与 C 不可分,从本质上讲 UNIX 就是 C语言 的运行时系统。base里有全部的ANSI C 标准的头文件,都在/usr/include,math.h 当然有,还有汇编语言的头文件呢。MIPS64汇编也是俺滴dream:D

回复: 怎么把自己的头文件加入系统目录/usr/include

发表于 : 2012-08-28 12:19
unreal
更正一下:OB 的pkg 目前还没有 clang 编译器。NB有。

回复: 怎么把自己的头文件加入系统目录/usr/include

发表于 : 2012-08-29 16:22
junfengfan
#more circle.c

#include<stdio.h>
#include<math.h>
int main(void)
{
double y;
int x,m;
for(y=10;y>=-10;y--)
{
m=2.5*sqrt(100-y*y);

for(x=1;x<30-m;x++) printf(" ");
printf("*");
for(;x<30+m;x++) printf(" ");
printf("*\n");
}
return 0;
}
gcc -Wall circle.c后出现
# gcc -Wall circle.c
/tmp//cc71c71Z.o(.text+0x31): In function `main':
: undefined reference to `sqrt'
collect2: ld returned 1 exit status




#include<stdio.h>
#include<math.h>
这里是不是不用设置 include的路径,比如 #/usr/include<stdio.h>??

回复: 怎么把自己的头文件加入系统目录/usr/include

发表于 : 2012-08-29 21:24
unreal
google了一把,并在龙芯平台上测试过了。
-------------------------------------
gcc -lm circle.c -o circle
-lm 就是链接到math库。

编译的时候如果有头文件,就需要编译器指定该头文件对应的库文件,库文件一般都在/usr/lib。gcc默认指定有几个库文件,比如libstd,但你所需要的math库不是gcc默认指定的,所以你在编译的时候要加上一个 -lm 选项。-l 是指定某某库,m 就是指定math 库。

回复: 怎么把自己的头文件加入系统目录/usr/include

发表于 : 2012-08-30 10:10
junfengfan
#include <graphics.h>
#include <math.h>

void polygon(x0,y0,a,n,af)
int x0,y0,a,n;
float af;
{
int x,y,i;
float dtheta,theta;
if(n<3)
return;
dtheta=6.28318/n;
theta=af*0.0174533;
moveto(x0,y0);
x=x0;
y=y0;
for(i=0;i<n;i++)
{
x=x+a*cos(theta);
y=y+a*sin(theta);
lineto(x,y);
theta=theta+dtheta;
}
lineto(x0,y0);
}
void main()
{
int i,a=80,x=200,y=100;
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"C:\\tc");
cleardevice();
setbkcolor(9);
setcolor(4);
for(i=3;i<=10;i++)
polygon(x,y,a,i,0.);
getch();
closegraph();
}

请您再测试一个,以后我自己找答案,谢谢

回复: 怎么把自己的头文件加入系统目录/usr/include

发表于 : 2012-08-30 13:58
unreal
junfengfan 兄弟:很抱歉,我学 C 才两三天时间,几乎帮不上你什么忙。我在 OB/loongson 5.2 下面测试你上面的代码,结果如下:

$ cc graphi.c -o graph
graphi.c:1:22: error: graphics.h: No such file or directory
graphi.c: In function 'main':
graphi.c:30: error: 'DETECT' undeclared (first use in this function)
graphi.c:30: error: (Each undeclared identifier is reported only once
graphi.c:30: error: for each function it appears in.)
graphi.c:28: warning: return type of 'main' is not 'int'

根据编译器给出的信息来看:因为系统里没有graphics.h (我用的教材到是有提供这个头文件);然后 main 函数里有未声明的变量 DETECT 引起第30行代码的报错;main 返回的数据类型不是整形。
另外,代码里 "C:\\tc" 这个字符串是怎么回事?你这个代码不是在 BSD 系统里写的?

回复: 怎么把自己的头文件加入系统目录/usr/include

发表于 : 2012-09-03 13:58
junfengfan
第一个问题:如果有多个头文件你怎么办?
第二个问题:我不是openbsd里面写的C语言,而是在网上随便找的例子,想试一下看能否在openbsd可以运行?感觉还是把C语言弄懂后再在openbsd上面写吧,还是感觉困难重重,我准备先把郝斌的c语言讲座好好消化消化,这也许只是自己一时的头脑发热

回复: 怎么把自己的头文件加入系统目录/usr/include

发表于 : 2012-09-05 1:37
unreal
先补充一下:在回复7楼时已经解决了我在首楼的问题。把 私有的库/头文件加入系统目录,那么私有库就变身为标准库了,在引用时自然需要把 “” 改为 <> 。现在觉得木有必要把自有的库放到标准库一起。
junfengfan 写了:第一个问题:如果有多个头文件你怎么办?
每个库用一行 #include ,这有什么问题吗?
还有,C语言木有图形库的,所有的代码里如果有包含类似 graphics.h 这样的图形库,一定是教材作者自己写的,引用是注意符号。
另外,可以用相对路径指定库所在的
位置,比如 #include <mylib/genlib.h> ,前天在书店看某本影印版C教程看来的,还未动手验证。
junfengfan 写了: 第二个问题:我不是openbsd里面写的C语言,而是在网上随便找的例子,想试一下看能否在openbsd可以运行?感觉还是把C语言弄懂后再在openbsd上面写吧,还是感觉困难重重,我准备先把郝斌的c语言讲座好好消化消化,这也许只是自己一时的头脑发热
你的学习方法可能是最好的,但可能并不是最适合你的。
按我的理解,C语言是贴近硬件的语言(我是准备把C和汇编混合使用的),所以网上找的示例代码要弄清楚是在哪种架构平台、哪个OS上写的,完全理解这些代码然后再在自己的环境里跑跑看。有些操作比如指针寻址 在RISC/CISC、大尾端/小尾端的架构上会有不同的结果。C语言也是发展的,从K&D、ANSI 到 C99,而现代的编译环境未必能完全兼容很早期的代码。C语言在哪个平台都能学,而UNIX是最佳平台,你不能说等学会了游泳再下水吧。

推荐一下我正在用的教材:《C语言的科学和艺术(The Art and Science of C)》作者:Eric S. Roberts (斯坦福) 机械工业出版社。
这是我找到的最好的C入门教材,没有之一!

回复: 怎么把自己的头文件加入系统目录/usr/include

发表于 : 2012-09-05 6:36
f5b
unreal 写了:
推荐一下我正在用的教材:《C语言的科学和艺术(The Art and Science of C)》作者:Eric S. Roberts (斯坦福) 机械工业出版社。
这是我找到的最好的C入门教材,没有之一!
前端时间OpenBSD misc讨论了c的学习,看起来大家最推崇的书是
The C Programming Language
http://cm.bell-labs.com/cm/cs/cbook/

回复: 怎么把自己的头文件加入系统目录/usr/include

发表于 : 2012-09-05 19:54
unreal
f5b 写了:前端时间OpenBSD misc讨论了c的学习,看起来大家最推崇的书是
The C Programming Language
http://cm.bell-labs.com/cm/cs/cbook/
C和UNIX之父的书当然知名度更广啦,但这本太精练了,不一定最适合没有任何语言基础的初学者,特别是非计算机专业的。