自己调用自己定义的函数,编译时出现"multiple definition of"错误!

时间:2022-12-22 14:50:50
我写一个程序,其中一些函数调用了自己定义的另外的函数,结果编译时出现”multiple definition of“错误,为了简化起见,我写了这个测试例子:main函数调用testA()和testB(),testA()和testB()里又都调用了另一个文件里的testC(),代码如下:
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


引用 2 楼  的回复:
在testc之前加上static应该就没有问题了
C/C++ code

static void testC(void)
{
    cout<<"C"<<endl;
}

谢谢,改成这样还是有一个编译错误:

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,重新编译

#7


引用 3 楼  的回复:
LZ别忽悠人吧,这里贴的代码根本就不会有问题。

不过后面写的文字倒确实是问题。

我把完整代码上传到了github上,用"git clone https://github.com/zwdnet/test.git"命令可以克隆完整代码,或者没有git的话,到https://github.com/zwdnet/test.git上可以下载zip文件。

#8


引用 6 楼  的回复:
你把testC.cpp删了,把函数定义放在testC.h中,加上static
然后删除.o,重新编译

谢谢,找您说的,能行!但是还有个问题,能不能保持函数声明跟函数定义分离的?不是提倡这样吗?github上的代码我也更新了。

#9


引用 8 楼  的回复:
引用 6 楼  的回复:

你把testC.cpp删了,把函数定义放在testC.h中,加上static
然后删除.o,重新编译

谢谢,找您说的,能行!但是还有个问题,能不能保持函数声明跟函数定义分离的?不是提倡这样吗?github上的代码我也更新了。

应该分离的。。
你的定义看了下没有问题。很久没用过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


引用 2 楼  的回复:
在testc之前加上static应该就没有问题了
C/C++ code

static void testC(void)
{
    cout<<"C"<<endl;
}

谢谢,改成这样还是有一个编译错误:

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,重新编译

#7


引用 3 楼  的回复:
LZ别忽悠人吧,这里贴的代码根本就不会有问题。

不过后面写的文字倒确实是问题。

我把完整代码上传到了github上,用"git clone https://github.com/zwdnet/test.git"命令可以克隆完整代码,或者没有git的话,到https://github.com/zwdnet/test.git上可以下载zip文件。

#8


引用 6 楼  的回复:
你把testC.cpp删了,把函数定义放在testC.h中,加上static
然后删除.o,重新编译

谢谢,找您说的,能行!但是还有个问题,能不能保持函数声明跟函数定义分离的?不是提倡这样吗?github上的代码我也更新了。

#9


引用 8 楼  的回复:
引用 6 楼  的回复:

你把testC.cpp删了,把函数定义放在testC.h中,加上static
然后删除.o,重新编译

谢谢,找您说的,能行!但是还有个问题,能不能保持函数声明跟函数定义分离的?不是提倡这样吗?github上的代码我也更新了。

应该分离的。。
你的定义看了下没有问题。很久没用过make了这边也没有可供使用的工具测试。
可能是你的makefile的问题。你试试把makefile里面各个项的依赖文件加进去然后再remove以下再make一次.

#10


唉,还是没折腾出个四五六来,但是把函数声明和定义放到一个头文件里,函数前面加static的确可行,我在我的项目里试了也是编译通过。先救急,就这么写吧。谢谢各位!

#11


结贴了,另外那个临时的github项目我删了。