/* main.c */
#include "mytool1.h"
#include "mytool2.h"
int main(int argc,char **argv)
{
mytool1_print("hello");
mytool2_print("hello");
}
/* mytool1.h */
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif
/* mytool1.c */
#include "mytool1.h"
void mytool1_print(char *print_str)
{
printf("This is mytool1 print %s ",print_str);
}
/* mytool2.h */
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif
/* mytool2.c */
#include "mytool2.h"
void mytool2_print(char *print_str)
{
printf("This is mytool2 print %s ",print_str);
}
我这样来编译:
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
但是最后发生错误,如下:
gcc -o main main.o mytool1.o mytool2.o
main.o(.text+0x19): In function `main':
: undefined reference to `mytool1_print'
main.o(.text+0x29): In function `main':
: undefined reference to `mytool2_print'
collect2: ld returned 1 exit status
make: *** [main] Error 1
请高手指教!
10 个解决方案
#1
在主程序中不能加入#include "mytool1.h" #include "mytool2.h"
改成#include "mytool1.c" #include "mytool2.c"
改成#include "mytool1.c" #include "mytool2.c"
#2
楼上的不要误导人家。
你的那种用法是极其不规范的,在大一点的程序中将死无葬身之地。。。。。
楼主帖出来的程序没有任何问题, 所以估计是楼主原来的程序有点出入,可以仔细检查一下,源代码中main.c中调用的函数和在其他文件中定义的名字是不是一样。也可能是开始编译了后来改了程序,没完全重新编译,所以可以删除所有.o文件,重新编译,连接,应该没问题的。
你的那种用法是极其不规范的,在大一点的程序中将死无葬身之地。。。。。
楼主帖出来的程序没有任何问题, 所以估计是楼主原来的程序有点出入,可以仔细检查一下,源代码中main.c中调用的函数和在其他文件中定义的名字是不是一样。也可能是开始编译了后来改了程序,没完全重新编译,所以可以删除所有.o文件,重新编译,连接,应该没问题的。
#3
我就是都检查过了,而且还是用makefile的方法编译的,所以才郁闷的!
#4
确认没有如下笔误
1
和
小写的L
1
和
小写的L
#5
main程序不要用main.c,改成任意其他名字,就可以了。具体原因我也说不明白。
#6
to:yoke_wolf(漠中草) :
谢谢你的指导,我以后注意一下写作风格了;经你指点,我现在明白了我这样写程序的缺点所在了,因为如果程序文件多了之后,这种嵌套关系太容易出错了!
谢谢你的指导,我以后注意一下写作风格了;经你指点,我现在明白了我这样写程序的缺点所在了,因为如果程序文件多了之后,这种嵌套关系太容易出错了!
#7
程序没问题。命名为main.c也没有问题。
我copy上面的代码在机器上编译通过(copy过程由于编码原因,需要把逗号分号去掉重新敲)。
估计你的问题还是yoke_wolf(漠中草)所说的,make之前没有clean,或者存在没注意的书写错误。
将文件分成.h和.c这种风格应该来说是不错的;声明和实现分成独立的文件。对于大项目这样应该是
比较方便管理的。不过如果太小的程序,声明和实现总共不过一百行,那也没太大的必要非得分开。
//个人观点,仅供参考。
我copy上面的代码在机器上编译通过(copy过程由于编码原因,需要把逗号分号去掉重新敲)。
估计你的问题还是yoke_wolf(漠中草)所说的,make之前没有clean,或者存在没注意的书写错误。
将文件分成.h和.c这种风格应该来说是不错的;声明和实现分成独立的文件。对于大项目这样应该是
比较方便管理的。不过如果太小的程序,声明和实现总共不过一百行,那也没太大的必要非得分开。
//个人观点,仅供参考。
#8
不给问题点数分,拒绝回答!
#9
各位所说的方法我都试过了,为什么还是不行,真是要命啊!
#10
哎~~~
你把文件都删除了,照着这个你帖子帖的代码重新敲一遍吧
看仔细点,慢点敲,保证OK
你把文件都删除了,照着这个你帖子帖的代码重新敲一遍吧
看仔细点,慢点敲,保证OK
#1
在主程序中不能加入#include "mytool1.h" #include "mytool2.h"
改成#include "mytool1.c" #include "mytool2.c"
改成#include "mytool1.c" #include "mytool2.c"
#2
楼上的不要误导人家。
你的那种用法是极其不规范的,在大一点的程序中将死无葬身之地。。。。。
楼主帖出来的程序没有任何问题, 所以估计是楼主原来的程序有点出入,可以仔细检查一下,源代码中main.c中调用的函数和在其他文件中定义的名字是不是一样。也可能是开始编译了后来改了程序,没完全重新编译,所以可以删除所有.o文件,重新编译,连接,应该没问题的。
你的那种用法是极其不规范的,在大一点的程序中将死无葬身之地。。。。。
楼主帖出来的程序没有任何问题, 所以估计是楼主原来的程序有点出入,可以仔细检查一下,源代码中main.c中调用的函数和在其他文件中定义的名字是不是一样。也可能是开始编译了后来改了程序,没完全重新编译,所以可以删除所有.o文件,重新编译,连接,应该没问题的。
#3
我就是都检查过了,而且还是用makefile的方法编译的,所以才郁闷的!
#4
确认没有如下笔误
1
和
小写的L
1
和
小写的L
#5
main程序不要用main.c,改成任意其他名字,就可以了。具体原因我也说不明白。
#6
to:yoke_wolf(漠中草) :
谢谢你的指导,我以后注意一下写作风格了;经你指点,我现在明白了我这样写程序的缺点所在了,因为如果程序文件多了之后,这种嵌套关系太容易出错了!
谢谢你的指导,我以后注意一下写作风格了;经你指点,我现在明白了我这样写程序的缺点所在了,因为如果程序文件多了之后,这种嵌套关系太容易出错了!
#7
程序没问题。命名为main.c也没有问题。
我copy上面的代码在机器上编译通过(copy过程由于编码原因,需要把逗号分号去掉重新敲)。
估计你的问题还是yoke_wolf(漠中草)所说的,make之前没有clean,或者存在没注意的书写错误。
将文件分成.h和.c这种风格应该来说是不错的;声明和实现分成独立的文件。对于大项目这样应该是
比较方便管理的。不过如果太小的程序,声明和实现总共不过一百行,那也没太大的必要非得分开。
//个人观点,仅供参考。
我copy上面的代码在机器上编译通过(copy过程由于编码原因,需要把逗号分号去掉重新敲)。
估计你的问题还是yoke_wolf(漠中草)所说的,make之前没有clean,或者存在没注意的书写错误。
将文件分成.h和.c这种风格应该来说是不错的;声明和实现分成独立的文件。对于大项目这样应该是
比较方便管理的。不过如果太小的程序,声明和实现总共不过一百行,那也没太大的必要非得分开。
//个人观点,仅供参考。
#8
不给问题点数分,拒绝回答!
#9
各位所说的方法我都试过了,为什么还是不行,真是要命啊!
#10
哎~~~
你把文件都删除了,照着这个你帖子帖的代码重新敲一遍吧
看仔细点,慢点敲,保证OK
你把文件都删除了,照着这个你帖子帖的代码重新敲一遍吧
看仔细点,慢点敲,保证OK