Hi everyone,
I'm new in this forum. I hope you could help me with this code.
I'm trying to include in an ANSI C project, some (OpenCV) libraries made in C++.
When I included those libraries, the compiler threw the following error:
ardrone_testing_tool.c: (.text+0x1212) : undefined reference to `cvSURFParams'
ardrone_testing_tool.c: (.text+0x126f) : undefined reference to `cvExtractSURF'
Basically people told me to change the compiler to the g++ (if anyone think about a better solution, please tell me. However, I think I'll have to edit the Makefile of the project...). The main Makefile of the project uses some standard variables like MAKE, which calls recursively another makefile, in the folder VP_SDK/Build.
In that folder, the other makefile has some sections which calls again another makefiles to configure variables and so on. Finally it calls generic.makefile which sets the compiler and does the compilation.
The point is that now, when I changed the word gcc by g++ the compilation didn't work (the original version which had worked with the gcc).
The error that it gives is the following:
../../VLIB/video_codec.c: In function �int video_codec_open_private(video_controller_t*, codec_type_t, int32_t)':
../../VLIB/video_codec.c:75: error: invalid conversion from �void*' to �video_macroblock_t*'
../../VLIB/video_codec.c: In function �int video_codec_type_select(video_controller_t*, video_stream_t*)':
../../VLIB/video_codec.c:190: error: invalid conversion from �uint32_t' to �codec_type_t'
../../VLIB/video_codec.c:190: error: initializing argument 2 of �int video_codec_open_private(video_controller_t*, codec_type_t, int32_t)'
../../VLIB/video_codec.c: In function �int video_encode_picture(video_controller_t*, const vp_api_picture_t*, int32_t*)':
../../VLIB/video_codec.c:198: error: invalid conversion from �int' to �PixelFormat'
../../VLIB/video_codec.c: In function �int video_decode_picture(video_controller_t*, vp_api_picture_t*, video_stream_t*, int32_t*)':
../../VLIB/video_codec.c:237: error: invalid conversion from �int' to �PixelFormat'
That is, an error previously hadn't detected by the gcc.
So, I think maybe I should differentiate in the code the treatment of .cpp files and the other files.
Below in the post you will see some parts of the code. In the macro INTERNAL_SOURCE_EXTENSIONS, there are defined the extensions .c .S .s .cpp. You can see also that there are some other macros that depend on that... For example INTERNAL_BINARIES_COMMON_TARGET_OFILES, which after is used to do different things (and compilation of course).
Anyway, I'm thinking of doing something like duplicating some macros, to do the compilation in two parts (on one side .c .S .s and on the other .cpp).
I don't know much about makefiles, so I would like to know what do you think about that. Is that convinient to do? There is another better or easier way to make it work?
Here I show you some lines of the file generic.makefile, but I could put all the code if you think is necessary.
I will be really appreciated if you give me some help. May be for some of you is not quite difficult to see the changes that has to be made in the complete version of the code.
INTERNAL_SOURCE_EXTENSIONS= .c .S .s .cpp
INTERNAL_MKDIR=mkdir -p
INTERNAL_ECHO=echo
# (in) GENERIC_COMMAND_PREFIX
INTERNAL_CC:=$(GENERIC_COMMAND_PREFIX)gcc
INTERNAL_AR:=$(GENERIC_COMMAND_PREFIX)ar
INTERNAL_OBJCOPY:=$(GENERIC_COMMAND_PREFIX)objcopy
INTERNAL_STRIP:=$(GENERIC_COMMAND_PREFIX)strip
# (in) GENERIC_CFLAGS # (in) GENERIC_LDFLAGS
# (in) GENERIC_ARFLAGS # (in) GENERIC_INCLUDES
# (in) GENERIC_ADD_OFILES : for linking with # (in) GENERIC_LIBRARY_SOURCE_DIR
# (in) GENERIC_LIBRARY_SOURCE_FILES # (in) GENERIC_LIBRARY_TARGET_DIR : for .o files
INTERNAL_LIBRARY_SOURCE_FILES:=$(patsubst %,$(GENERIC_LIBRARY_SOURCE_DIR)/%,$(GENERIC_LIBRARY_SOURCE_FILES))
INTERNAL_LIBRARY_TARGET_OFILES:=$(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),\
$(patsubst $(GENERIC_LIBRARY_SOURCE_DIR)/%$(ext),$(GENERIC_LIBRARY_TARGET_DIR)/%.o,$(filter %$(ext),$(INTERNAL_LIBRARY_SOURCE_FILES))))
# (in) GENERIC_BINARIES_SOURCE_DIR # (in) GENERIC_BINARIES_COMMON_SOURCE_FILES # (in) GENERIC_BINARIES_SOURCE_ENTRYPOINTS # (in) GENERIC_BINARIES_TARGET_DIR : for .o files
INTERNAL_BINARIES_COMMON_SOURCE_FILES:=$(patsubst %,$(GENERIC_BINARIES_SOURCE_DIR)/%,$(GENERIC_BINARIES_COMMON_SOURCE_FILES))
INTERNAL_BINARIES_COMMON_TARGET_OFILES:=$(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),\
$(patsubst $(GENERIC_BINARIES_SOURCE_DIR)/%$(ext),$(GENERIC_BINARIES_TARGET_DIR)/%.o,$(filter %$(ext),$(INTERNAL_BINARIES_COMMON_SOURCE_FILES))))
INTERNAL_BINARIES_TARGET_OENTRYPOINTS:=$(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),\
$(patsubst %$(ext),$(GENERIC_BINARIES_TARGET_DIR)/%.o,$(filter %$(ext),$(GENERIC_BINARIES_SOURCE_ENTRYPOINTS))))
===================================
ifeq ($(USE_DLL),yes)
$(GENERIC_COMMAND_PREFIX)dlltool -e $(GENERIC_TARGET_BINARIES_DIR)/$(DLL_ID)_exports.o --export-all-symbols -l $(@:.dll=.lib) $(INTERNAL_BINARIES_COMMON_TARGET_OFILES)
$(INTERNAL_CC) --shared -o $@ $(INTERNAL_BINARIES_COMMON_TARGET_OFILES) $(GENERIC_TARGET_BINARIES_DIR)/$(DLL_ID)_exports.o $(GENERIC_ADD_OFILES) $(GENERIC_LIB_PATHS) $(GENERIC_LIBS) $(GENERIC_LDFLAGS) $(LDFLAGS_$(subst /,_,$*))
$(RM) $(GENERIC_TARGET_BINARIES_DIR)/$(DLL_ID)_exports.o
else
$(INTERNAL_CC) -o $@ $(GENERIC_BINARIES_TARGET_DIR)/$*.o $(INTERNAL_BINARIES_COMMON_TARGET_OFILES) $(GENERIC_ADD_OFILES) $(GENERIC_LIB_PATHS) $(GENERIC_LIBS) $(GENERIC_LDFLAGS) $(LDFLAGS_$(subst /,_,$*))
endif
===================================
# Build rules for each extension
$(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),$(eval $(call BUILD_OFILE_TEMPLATE,LIBRARY,$(ext))))
$(foreach ext,$(INTERNAL_SOURCE_EXTENSIONS),$(eval $(call BUILD_OFILE_TEMPLATE,BINARIES,$(ext))))
ifneq ($(MAKECMDGOALS),clean)
ifneq ($(MAKECMDGOALS),check)
-include $(INTERNAL_LIBRARY_DEPFILES) $(INTERNAL_BINARIES_DEPFILES)
endif
endif
Thank You all for any comments that you could give me.
Best Regards,
Hern�n.