对函数错误的未定义引用,同时使用 C 和 C++

Posted

技术标签:

【中文标题】对函数错误的未定义引用,同时使用 C 和 C++【英文标题】:Undefined reference to function errors, using C and C++ together 【发布时间】:2017-04-21 09:44:22 【问题描述】:

我在同时使用 C 和 C++ 代码时遇到了问题。当从 调用 'make' 命令时,SPConfig.cSPLogger.c 中的所有函数都会返回“未定义的函数引用” >SPImageProc.cpp#include部分相关文件如下:

SPLogger.c

#include "SPLogger.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

SPConfig.h

#ifndef SPCONFIG_H_
#define SPCONFIG_H_

#include <stdbool.h>
#include <stdio.h>
#include "SPLogger.h"
//Functions definitions
#endif /* SPCONFIG_H_ */

SPConfig.c

#include "SPConfig.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

SPImageProc.h

#ifndef SPIMAGEPROC_H_
#define SPIMAGEPROC_H_
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <vector>

extern "C" 
#include "SPConfig.h"
#include "SPPoint.h"


namespace sp 
//Class and function definitions

SPImageProc.cpp

#include <cstdlib>
#include <cassert>
#include <cstring>
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <cstdio>
#include "SPImageProc.h"
extern "C" 
#include "SPLogger.h"

生成文件

CC = gcc
CPP = g++
#put all your object files here
OBJS = main.o SPImageProc.o SPPoint.o 
#The executabel filename
EXEC = SPCBIR
INCLUDEPATH=/usr/local/lib/opencv-3.1.0/include/
LIBPATH=/usr/local/lib/opencv-3.1.0/lib/
LIBS=-lopencv_xfeatures2d -lopencv_features2d \
-lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lopencv_core


CPP_COMP_FLAG = -std=c++11 -Wall -Wextra \
-Werror -pedantic-errors -DNDEBUG

C_COMP_FLAG = -std=c99 -Wall -Wextra \
-Werror -pedantic-errors -DNDEBUG

.PHONY: all clean

all: $(EXEC)

$(EXEC): $(OBJS)
    $(CPP) $(OBJS) -L$(LIBPATH) $(LIBS) -o $@
main.o: main.cpp #put dependencies here!
    $(CPP) $(CPP_COMP_FLAG) -I$(INCLUDEPATH) -c $*.cpp
#a rule for building a simple c++ source file
#use g++ -MM SPImageProc.cpp to see dependencies
SPImageProc.o: SPImageProc.cpp SPImageProc.h SPConfig.h SPPoint.h SPLogger.h
    $(CPP) $(CPP_COMP_FLAG) -I$(INCLUDEPATH) -c $*.cpp
#a rule for building a simple c source file
#use "gcc -MM SPPoint.c" to see the dependencies

SPPoint.o: SPPoint.c SPPoint.h 
    $(CC) $(C_COMP_FLAG) -c $*.c
clean:
    rm -f $(OBJS) $(EXEC)

一些 Makefile 错误:

SPImageProc.o: In function `sp::ImageProc::initFromConfig(sp_config_t*)':
SPImageProc.cpp:(.text+0xc8): undefined reference to `spConfigGetPCADim'
SPImageProc.cpp:(.text+0xf2): undefined reference to `spLoggerPrintError'
SPImageProc.cpp:(.text+0x12c): undefined reference to `spConfigGetNumOfImages'

我已经在它们各自的 C 和 CPP 文件中实现了这些功能。我自己尝试了很多来修复它,并在 Stack Overflow 上查找了类似的问题,但找不到解决方案。请帮忙。

【问题讨论】:

【参考方案1】:

您没有链接SPLogger.oSPConfig.o

或者甚至为此编译它们。

您需要为SPLogger.oSPConfig.o 添加类似于SPImageProc.o 的make 规则,并且您需要将它们添加到OBJS

【讨论】:

非常感谢您解决这个问题。我已经编辑了生成文件以链接 SPLogger.o 和 SPConfig.o。现在正在编译。再次感谢。

以上是关于对函数错误的未定义引用,同时使用 C 和 C++的主要内容,如果未能解决你的问题,请参考以下文章

c++中对静态变量的未定义引用

对 __isoc99_sscanf 的未定义引用

对二叉树类 C++ 函数的未定义引用

C++ 错误:对“<func name>”的未定义引用和 ld 返回 1 个退出状态 [重复]

对“memcached_exist”的未定义引用

OpenCV“对'cv :: imread'等C ++的未定义引用