未定义引用'some_function'?

pyt*_*nic 1 c c++ linux gcc x86-64

我正在尝试编译一个C++程序,它给了我这个错误.

undefined reference to 'some_function'
Run Code Online (Sandbox Code Playgroud)

而我确实添加了包含some_function在makefile中的文件.另外,我some_function在我使用它的文件中包含声明.那么为什么编译器仍抱怨它无法找到呢?可能的原因是什么?

我的makefile就是这样的

CXX = g++
CXXFILES = dlmalloc.c pthreads.cpp queue.cpp 

CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE
LIBS = -lpthread -ldl

all:
    $(CXX) $(CXXFILES) $(LIBS) $(CXXFLAGS)

clean:
    rm -f prog *.o
Run Code Online (Sandbox Code Playgroud)

some_functiondlmalloc.c内部定义并在内部使用pthreads.cpp.是否与dlmalloc.cC源代码文件有关,其他是C++文件.也许我应该在这里使用extern "C"关键字some_function,对吗?

Mik*_*our 8

也许我应该在这里使用extern"C"关键字,对吧?

是.如果你想从C++代码中调用一个编译为C的函数,那么你需要声明它extern "C"- 但只能在C++中,因为它在C语言中不是有效的语法.

您可以使用__cplusplus预处理程序符号创建对任一语言都有效的标头:

#ifdef __cplusplus
extern "C" {
#endif
void some_function();

/* many, many more C declarations */

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

里面的东西extern "C" { ... }作为C声明处理.要小心确保每个函数总是以这种方式为C++声明,并且奇怪的是C函数实际上是用C++编写的(强烈反对!),decaration 必须在函数的实际定义之前.