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_function
在dlmalloc.c
内部定义并在内部使用pthreads.cpp
.是否与dlmalloc.c
C源代码文件有关,其他是C++文件.也许我应该在这里使用extern "C"
关键字some_function
,对吗?
也许我应该在这里使用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 必须在函数的实际定义之前.