2017-04-21 2 views
2

Ich habe ein Problem bei der Verwendung von C und C++ Code zusammen laufen. Die 'make' Befehl gibt "nicht definiert Bezug zur Funktion" in für alle Funktionen SPConfig.c und SPLogger.c, wenn sie von SPImageProc.cpp Abschnitte dieser relevanten Dateien

#include genannt sind unten angegeben:
Undefinierter Verweis auf Funktionsfehler, mit C und C++ zusammen

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" 
} 

Makefile

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 [email protected] 
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) 

Einige Fehler 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' 

Ich habe die Funktionen in ihren jeweiligen C und CPP-Dateien implementiert. Ich habe viel versucht, es selbst zu reparieren und habe es auf Stack Overflow nach ähnlichen Problemen gesucht, konnte aber keine Lösung finden. Bitte helfen Sie.

Antwort

1

verknüpfen Sie nicht SPLogger.o und SPConfig.o

Oder auch sie für diese Angelegenheit zu kompilieren.

Sie müssen sich für SPLogger.o und SPConfig.o ähnlich wie SPImageProc.o machen Regeln hinzufügen und Sie müssen sie OBJS hinzuzufügen.

+0

Vielen Dank für das herauszufinden. Ich habe das Makefile bearbeitet, um SPLogger.o und SPConfig.o zu verbinden. Es kompiliert jetzt. Danke noch einmal. –

Verwandte Themen