abc.c文件
#include "abc.h"
int abc()
{
return 10;
}
abc.h文件
int abc();
mymain.cpp文件
#include "abc.h"
int main()
{
abc();
return 0;
}
生成文件
CC=gcc -O2
CP=g++
mymain: mymain.o abc.o
$(CP) -o mymain mymain.o abc.o
mymain.o: mymain.cpp abc.h
$(CP) -c mymain.cpp abc.h
abc.o: abc.c abc.h
$(CC) -c abc.c abc.h
clean:
$(RM) *.o mymain
输出
g++ -c mymain.cpp abc.h
gcc -O2 -c abc.c abc.h
g++ -o mymain mymain.o abc.o
mymain.o: In function `main':
mymain.cpp:(.text+0x5): undefined reference to `abc()'
collect2: error: ld returned 1 exit status
make: *** [mymain] Error 1
为什么abc()是未定义的引用?链接错误C和C++(未定义参考)
UPDATE
新abc.h
extern "C" {
int abc();
}
错误
g++ -c mymain.cpp abc.h
gcc -O2 -c abc.c abc.h
In file included from abc.c:1:0:
abc.h:1:8: error: expected identifier or ‘(’ before string constant
extern "C" {
^
abc.h:1:8: error: expected identifier or ‘(’ before string constant
extern "C" {
^
make: *** [abc.o] Error 1
不要将'abc.h'传递给编译器。头文件在被'.c'或'.cpp'文件'#include'ed处理时被处理。 –
另外,'CP'对此是一个非常糟糕的名字。大多数人会认为你正在试图复制一个文件。 make for C++编译器中的默认变量名是'CXX'(和'CXXFLAGS'用于C++编译器特定的标志)。 – MadScientist