1

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

undefined reference to 'some_function'

而我确实添加了包含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

some_function在 中定义dlmalloc.c和使用pthreads.cpp。它是否与dlmalloc.c是 C 源代码文件而其他是 C++ 文件的事实有关。也许我应该在这里使用extern "C"关键字some_function,对吧?

4

1 回答 1

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

里面的东西extern "C" { ... }作为 C 声明处理。请注意确保每个函数始终以这种方式为 C++ 声明,并且在很奇怪的情况下,C 函数实际上是用 C++ 编写的(强烈不鼓励!)声明必须在函数的实际定义之前。

于 2012-07-03T17:29:40.797 回答