Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未定义对'的引用;一些函数';? 我试图编译一个C++程序,它给了我这个错误。 undefined reference to 'some_function'_C++_C_Linux_Gcc_X86 64 - Fatal编程技术网

未定义对'的引用;一些函数';? 我试图编译一个C++程序,它给了我这个错误。 undefined reference to 'some_function'

未定义对'的引用;一些函数';? 我试图编译一个C++程序,它给了我这个错误。 undefined reference to 'some_function',c++,c,linux,gcc,x86-64,C++,C,Linux,Gcc,X86 64,然而,我确实在makefile中添加了包含一些函数的文件。此外,我还将某些函数的声明包含在我使用它的文件中。那么为什么编译器仍然抱怨它找不到它呢?可能的原因是什么 我的makefile是这样的 CXX = g++ CXXFILES = dlmalloc.c pthreads.cpp queue.cpp CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE LIBS = -lpthread -ldl all: $(CXX) $(CXXFILES

然而,我确实在makefile中添加了包含
一些函数的文件。此外,我还将
某些函数的声明包含在我使用它的文件中。那么为什么编译器仍然抱怨它找不到它呢?可能的原因是什么

我的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
某些函数在
dlmalloc.c
中定义,并在
pthreads.cpp
中使用。这是否与代码< > DLMALLC.C./code >是C源代码文件有关,而其他是C++文件。也许我应该在这里使用
extern“C”
关键字和
一些函数,对吗

也许我应该在这里使用extern“C”关键字,对吗

对。如果你想调用C++ C++编译的函数,那么你需要声明它“代码>外部”C”/代码>,但是只能在C++中使用,因为这不是C.</P>中的有效语法。 您可以使用
\uuu cplusplus
预处理器符号创建对任何一种语言都有效的标头:

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

/* many, many more C declarations */

#ifdef __cplusplus
}
#endif
extern“C”{…}
中的内容作为C声明处理。注意,确保每个函数都是C++所声明的,而C函数实际上是用C++编写的(Stutial>强/强)。 也许我应该在这里使用extern“C”关键字,对吗

对。如果你想调用C++ C++编译的函数,那么你需要声明它“代码>外部”C”/代码>,但是只能在C++中使用,因为这不是C.</P>中的有效语法。 您可以使用
\uuu cplusplus
预处理器符号创建对任何一种语言都有效的标头:

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

/* many, many more C declarations */

#ifdef __cplusplus
}
#endif

extern“C”{…}
中的内容作为C声明处理。注意,确保每个函数都是用C++方式声明的,而且C函数实际上是用C++编写的,这是一个奇怪的机会(<强>强/强>泄气!)删除必须在函数的实际定义之前。

如果您可以显示编译命令或MaFaC++文件片段,在编译文件时,您可能会得到更多有用的输入,这可能意味着您没有编译包含该函数的代码,或者您没有链接它。两个源文件都是用同一种语言编写的吗?使用
extern“C”
似乎是一个非常好的主意!如果您可以显示编译命令或MaFC++文件片段,在编译文件时,您可能会得到更多有用的输入,这可能意味着您没有编译包含该函数的代码,或者您没有链接它。两个源文件都是用同一种语言编写的吗?使用
extern“C”
似乎是一个非常好的主意!