Problem with Makefile with compiling a C ++ program

I recently got MySQL compiled and running on Cygwin and got a simple test case from the Internet to make sure it worked. Sample test compiled and successfully completed.

However, when you include MySQL in my hobby, the project does not compile, and I think that this is due to the way the Makefile is configured, I have no experience with the Makefile, and after reading the tutorials about them I have a better understanding, but still can’t make it work correctly.

When I try to compile a project of my hobby, I get errors such as:

Obj/Database.o:Database.cpp:(.text+0x492): undefined reference to `_mysql_insert_id' Obj/Database.o:Database.cpp:(.text+0x4c1): undefined reference to `_mysql_affected_rows' collect2: ld returned 1 exit status make[1]: *** [build] Error 1 make: *** [all] Error 2 

Here is my Makefile, it worked with compiling and creating the source before I tried to include MySQL support in the project. LIBMYSQL paths are correct, checked by "mysql_config".

 COMPILER = g++ WARNING1 = -Wall -Werror -Wformat-security -Winline -Wshadow -Wpointer-arith WARNING2 = -Wcast-align -Wcast-qual -Wredundant-decls LIBMYSQL = -I/usr/local/include/mysql -L/usr/local/lib/mysql -lmysqlclient DEBUGGER = -g3 OPTIMISE = -O C_FLAGS = $(OPTIMISE) $(DEBUGGER) $(WARNING1) $(WARNING2) -export-dynamic $(LIBMYSQL) L_FLAGS = -lz -lm -lpthread -lcrypt $(LIBMYSQL) OBJ_DIR = Obj/ SRC_DIR = Source/ MUD_EXE = project MUD_DIR = TestP/ LOG_DIR = $(MUD_DIR)Files/Logs/ ECHOCMD = echo -e L_GREEN = \e[1;32m L_WHITE = \e[1;37m L_BLUE = \e[1;34m L_RED = \e[1;31m L_NRM = \e[0;00m DATE = `date +%d-%m-%Y` FILES = $(wildcard $(SRC_DIR)*.cpp) C_FILES = $(sort $(FILES)) O_FILES = $(patsubst $(SRC_DIR)%.cpp, $(OBJ_DIR)%.o, $(C_FILES)) all: @$(ECHOCMD) " Compiling $(L_RED)$(MUD_EXE)$(L_NRM)."; @$(MAKE) -s build build: $(O_FILES) @rm -f $(MUD_EXE) $(COMPILER) -o $(MUD_EXE) $(L_FLAGS) $(O_FILES) @echo " Finished Compiling $(MUD_EXE)."; @chmod g+w $(MUD_EXE) @chmod a+x $(MUD_EXE) @chmod g+w $(O_FILES) $(OBJ_DIR)%.o: $(SRC_DIR)%.cpp @echo " Compiling $@ "; $(COMPILER) -c $(C_FLAGS) $< -o $@ .cpp.o: $(COMPILER) -c $(C_FLAGS) $< clean: @echo " Complete compile on $(MUD_EXE)."; @rm -f $(OBJ_DIR)*.o $(MUD_EXE) @$(MAKE) -s build 

I like the functionality of the Makefile, instead of splashing out all the arguments, etc., it just spits out “Compiling [Filename]”, etc.

If I add -c to L_FLAGS, then it compiles (I think), but spits out things like this instead:

 g++: Obj/Database.o: linker input file unused because linking not done 

After a day of trying and researching on Google, I’m no closer to solving my problem, so I’m coming to you guys to find out if you can explain to me why all this is happening and, if possible, steps to solve.

Regards, Steve

+4
source share
2 answers

Try to change

 $(COMPILER) -o $(MUD_EXE) $(L_FLAGS) $(O_FILES) 

to

 $(COMPILER) -o $(MUD_EXE) $(O_FILES) $(L_FLAGS) 

The component searches and processes libraries and object files in the order in which they are listed. Thus, when you mention libraries in front of object files, the functions used in object files may not be loaded from libraries.

+3
source

Have you tried using the built-in mysql_config --cflags and mysql_config --libs , respectively?

0
source

Source: https://habr.com/ru/post/1311194/


All Articles