main.cpp
#include <iostream>
#include <string>
#include "testA.h"
#include "testB.h"
using namespace std;
int main()
{
testA();
testB();
return 0;
}
testA.cpp及testA.h
//testA.h
#ifndef TESTA_H
#define TESTA_H
void testA(void);
#endif
//testA.cpp
#include <iostream>
#include "testA.h"
#include "testC.h"
using namespace std;
void testA(void)
{
cout<<"A"<<endl;
testC();
}
testB.cpp及testB.h
//testB.h
#ifndef TESTB_H
#define TESTB_H
void testB(void);
#endif
//testB.cpp
#include <iostream>
#include "testB.h"
#include "testC.h"
using namespace std;
void testB(void)
{
cout<<"B"<<endl;
testC();
}
testC.cpp及testC.h
//testC.h
#ifndef TESTC_H
#define TESTC_H
void testC(void);
#endif
//testC.cpp
#include <iostream>
using namespace std;
void testC(void)
{
cout<<"C"<<endl;
}
Makefile
main:main.cpp testA.o testB.o testC.o
g++ main.cpp testA.o testB.o testC.o -o main
rm *.o
testA.o:testA.cpp
g++ testA.cpp -c
testB.o:testB.cpp
g++ testB.cpp -c
testC.o:testC.cpp
g++ testC.cpp -c
编译后出现的错误如下:
g++ testC.cpp -c
g++ main.cpp testA.o testB.o testC.o -o main
testB.o: In function `testC()':
testB.cpp:(.text+0x0): multiple definition of `testC()'
testA.o:testA.cpp:(.text+0x0): first defined here
testC.o: In function `testC()':
testC.cpp:(.text+0x0): multiple definition of `testC()'
testA.o:testA.cpp:(.text+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [main] 错误 1
os:linux,编译器:gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
我搜了老半天,之前是testC()函数的声明和定义都放在testC.h里,编译出错,后来分成.h和.cpp两个文件,在.h文件里加extern,在testB.h和testA.h里加testC()的声明等等都试过,就是没法编译成功。只有来向大家求助了!多谢了!
11 个解决方案
#1
在testc之前加上static应该就没有问题了
void testC(void) { cout<<"C"<<endl; }
#2
在testc之前加上static应该就没有问题了
static void testC(void)
{
cout<<"C"<<endl;
}
#3
LZ别忽悠人吧,这里贴的代码根本就不会有问题。
不过后面写的文字倒确实是问题。
不过后面写的文字倒确实是问题。
#4
谢谢,改成这样还是有一个编译错误:
g++ testC.cpp -c
g++ main.cpp testA.o testB.o testC.o -o main
testB.o: In function `testC()':
testB.cpp:(.text+0x0): multiple definition of `testC()'
testA.o:testA.cpp:(.text+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [main] 错误 1
#5
把*.o文件删了,重新make,错误又变成这样了,真诡异!
make
g++ testA.cpp -c
g++ testB.cpp -c
g++ testC.cpp -c
g++ main.cpp testA.o testB.o testC.o -o main
testA.o: In function `testA()':
testA.cpp:(.text+0x2b): undefined reference to `testC()'
testB.o: In function `testB()':
testB.cpp:(.text+0x2b): undefined reference to `testC()'
collect2: ld returned 1 exit status
make: *** [main] 错误 1
#6
你把testC.cpp删了,把函数定义放在testC.h中,加上static
然后删除.o,重新编译
然后删除.o,重新编译
#7
我把完整代码上传到了github上,用"git clone https://github.com/zwdnet/test.git"命令可以克隆完整代码,或者没有git的话,到https://github.com/zwdnet/test.git上可以下载zip文件。
#8
谢谢,找您说的,能行!但是还有个问题,能不能保持函数声明跟函数定义分离的?不是提倡这样吗?github上的代码我也更新了。
#9
应该分离的。。
你的定义看了下没有问题。很久没用过make了这边也没有可供使用的工具测试。
可能是你的makefile的问题。你试试把makefile里面各个项的依赖文件加进去然后再remove以下再make一次.
#10
唉,还是没折腾出个四五六来,但是把函数声明和定义放到一个头文件里,函数前面加static的确可行,我在我的项目里试了也是编译通过。先救急,就这么写吧。谢谢各位!
#11
结贴了,另外那个临时的github项目我删了。
#1
在testc之前加上static应该就没有问题了
void testC(void) { cout<<"C"<<endl; }
#2
在testc之前加上static应该就没有问题了
static void testC(void)
{
cout<<"C"<<endl;
}
#3
LZ别忽悠人吧,这里贴的代码根本就不会有问题。
不过后面写的文字倒确实是问题。
不过后面写的文字倒确实是问题。
#4
谢谢,改成这样还是有一个编译错误:
g++ testC.cpp -c
g++ main.cpp testA.o testB.o testC.o -o main
testB.o: In function `testC()':
testB.cpp:(.text+0x0): multiple definition of `testC()'
testA.o:testA.cpp:(.text+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [main] 错误 1
#5
把*.o文件删了,重新make,错误又变成这样了,真诡异!
make
g++ testA.cpp -c
g++ testB.cpp -c
g++ testC.cpp -c
g++ main.cpp testA.o testB.o testC.o -o main
testA.o: In function `testA()':
testA.cpp:(.text+0x2b): undefined reference to `testC()'
testB.o: In function `testB()':
testB.cpp:(.text+0x2b): undefined reference to `testC()'
collect2: ld returned 1 exit status
make: *** [main] 错误 1
#6
你把testC.cpp删了,把函数定义放在testC.h中,加上static
然后删除.o,重新编译
然后删除.o,重新编译
#7
我把完整代码上传到了github上,用"git clone https://github.com/zwdnet/test.git"命令可以克隆完整代码,或者没有git的话,到https://github.com/zwdnet/test.git上可以下载zip文件。
#8
谢谢,找您说的,能行!但是还有个问题,能不能保持函数声明跟函数定义分离的?不是提倡这样吗?github上的代码我也更新了。
#9
应该分离的。。
你的定义看了下没有问题。很久没用过make了这边也没有可供使用的工具测试。
可能是你的makefile的问题。你试试把makefile里面各个项的依赖文件加进去然后再remove以下再make一次.
#10
唉,还是没折腾出个四五六来,但是把函数声明和定义放到一个头文件里,函数前面加static的确可行,我在我的项目里试了也是编译通过。先救急,就这么写吧。谢谢各位!
#11
结贴了,另外那个临时的github项目我删了。