当前位置: 技术问答>linux和unix
[新人问题]关于include .c 和 include .h
来源: 互联网 发布时间:2016-06-17
本文导语: 本帖最后由 xxxxxtt 于 2009-07-15 17:28:21 编辑 spcaview.c是一个摄像头采集程序 1:gcc编译: gcc -o spcaview spcaview.c -I/usr/local/include/SDL -SDL 错误如下: spcaview.c:(.text+0x568): undefined reference to `AVI_open_output_file' spcaview.c:(.text...
1:gcc编译:
gcc -o spcaview spcaview.c -I/usr/local/include/SDL -SDL
错误如下:
spcaview.c:(.text+0x568): undefined reference to `AVI_open_output_file'
spcaview.c:(.text+0x5ba): undefined reference to `AVI_set_video'
spcaview.c:(.text+0x6dc): undefined reference to `AVI_write_frame'
spcaview.c:(.text+0x7f0): undefined reference to `AVI_close'
然后我打开spcaview.c
把#include "avilib.h" 改成 #include "avilib.c" (spcaview.c目录下有文件avilib.h 和 avilib.c)
编译通过,程序运行正常。
2:同样是该spcaview.c
用g++ 编译
g++ -o spcaview spcaview.c -I/usr/local/include/SDL -SDL
错误如下:
spcaview.c:218: 错误: 从类型 ‘unsigned char*’ 到类型 ‘char*’ 的转换无效
spcaview.c:218: 错误: 初始化实参 2,属于 ‘int AVI_write_frame(avi_t*, char*, long int)’
spcaview.c:222: 错误: 从类型 ‘void*’ 到类型 ‘unsigned char*’ 的转换无效
spcaview.c: In function ‘void refresh_screen(unsigned char*, unsigned char*, int, int, int, int, int, int, int)’:
spcaview.c:263: 错误: 从类型 ‘void*’ 到类型 ‘unsigned char*’ 的转换无效
然后我打开spcaview.c
把#include "avilib.h" 改成 #include "avilib.c"
错误更多
问题:1. spcaview.c用gcc 编译,#include "avilib.h" 有问题,而#include "avilib.c"却可以?
2.用g++ 编译产生的 类型转换无效,怎么解决?(因为用gcc 没问题,所以我不认为是spcaview.c有问题)
3.把#include "avilib.h"改成"avilib.c"之后,为什么gcc编译通过,而g++却错误一大堆?C++兼容C,编译器也应该是兼容的呀。。
|
1. AVI_open_output_file 等函数的实现在 avilib.c 中, 所以。。
2. g++ 的类型转换要求更严格
3. 还是类型检查的问题。
解决办法:
gcc -c -o spcaview.o spcaview.c -I/usr/local/include/SDL -SDL
gcc -c -o avilib.o avilib.c -I/usr/local/include/SDL -SDL
gcc -o spcaview.o avilib.o spcaview
2. g++ 的类型转换要求更严格
3. 还是类型检查的问题。
解决办法:
gcc -c -o spcaview.o spcaview.c -I/usr/local/include/SDL -SDL
gcc -c -o avilib.o avilib.c -I/usr/local/include/SDL -SDL
gcc -o spcaview.o avilib.o spcaview
|
"1. spcaview.c用gcc 编译,#include "avilib.h" 有问题,而#include "avilib.c"却可以? "
是因为avilib.h只有函说明,而avilib.c才有函数体,一个可以这样包涵,还有个就是用Makefile编译连接起来
"2.用g++ 编译产生的 类型转换无效,怎么解决?(因为用gcc 没问题,所以我不认为是spcaview.c有问题) "
是因为g++对语法严格检查,解决办法是找到具体的位置,加上变量类型强行转换应该可以了
"3.把#include "avilib.h"改成"avilib.c"之后,为什么gcc编译通过,而g++却错误一大堆?C++兼容C,编译器也应该是兼容的呀。。 "
应该是兼容,只是gcc自动转换了,而g++没有自动转换
是因为avilib.h只有函说明,而avilib.c才有函数体,一个可以这样包涵,还有个就是用Makefile编译连接起来
"2.用g++ 编译产生的 类型转换无效,怎么解决?(因为用gcc 没问题,所以我不认为是spcaview.c有问题) "
是因为g++对语法严格检查,解决办法是找到具体的位置,加上变量类型强行转换应该可以了
"3.把#include "avilib.h"改成"avilib.c"之后,为什么gcc编译通过,而g++却错误一大堆?C++兼容C,编译器也应该是兼容的呀。。 "
应该是兼容,只是gcc自动转换了,而g++没有自动转换