日期:2014-05-16  浏览次数:20702 次

初学 Linux 程序设计,问个关于库的错误
首先 编写文件
 fred.c
C/C++ code

#include <stdio.h>

void fred(int arg)
{
    printf("fred: you passed %d\n", arg);
}



============================
bill.c
C/C++ code

#include <stdio.h>

void bill(char* arg)
{
     printf("bill: you passed %s\n", arg);
}



===============================

lib.c
C/C++ code

void bill(char* );
void fred(int);



============================
program.c

C/C++ code

#include "lib.c"
int main()
{
    bill("Hi,How are u");
    exot(0);
}



wengte@linux-ldg2:~/Desktop> gcc -c bill.c fred.c
wengte@linux-ldg2:~/Desktop> ls *.o
bill.o fred.o
wengte@linux-ldg2:~/Desktop> gcc -c program.c
program.c:1:17: error: lib.c: 没有那个文件或目录
wengte@linux-p



为什么会需要 lib.c 呢,如果在 windows 下,应该相当于 dll 和头文件的关系

------解决方案--------------------
有这句#include "lib.c",当然要lib.c了。
不明白楼主想问啥。

------解决方案--------------------
应该用头文件吧!

把 lib.c 改为 lib.h

或把gcc -c -fPIC bill.c fred.c
然后把 program.c 中 #include "lib.c" 去掉
gcc -L./ -lbill -lfred program.c
------解决方案--------------------
wengte@linux-ldg2:~/Desktop> gcc -c bill.c fred.c
wengte@linux-ldg2:~/Desktop> ls *.o
bill.o fred.o
wengte@linux-ldg2:~/Desktop> gcc -c program.c
program.c:1:17: error: lib.c: 没有那个文件或目录
wengte@linux-p
1. 生成动态链接库应该用gcc -shared -o -fIPC链接成so文件。
2. 出现的错误,应该是因为lib.c与program.c并不在同一文件下。预编译替换文件时就出错了。

------解决方案--------------------
C/C++ code

[root@localhost c]# gcc -c bill.c fred.c
[root@localhost c]# ls *.o
bill.o  fred.o
[root@localhost c]# gcc -c program.c
program.c: 在函数‘main’中:
program.c:5: 警告:隐式声明与内建函数‘exit’不兼容
[root@localhost c]# ls *.o
bill.o  fred.o  program.o
[root@localhost c]# gcc -o a *.o
[root@localhost c]# ./a
bill: you passed Hi,How are u
[root@localhost c]#

------解决方案--------------------
为什么会需要 lib.c 呢,如果在 windows 下,应该相当于 dll 和头文件的关系

既然include了肯定要让代码识别到lib。c这个文件的存在。
windows下的dll和头文件的关系:
头文件只是对dll内符号信息的描述,实现和入口肯定是在dll中的
------解决方案--------------------
设为中文环境自然提示就是中文了呗~
------解决方案--------------------
1. 头文件的文件名,你写错了。
lib.c --> lib.h

2. 需要将bill.c和fred.c编译成动态/静态链接库。并且动态/静态链接库的文件名必须以是lib.so/lib.ao。这样,头文件lib.h才能起作用。


------解决方案--------------------
动态链接库: lib.so
静态链接库: lib.a