Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Makefile issue with compiling a C++ program

I recently got MySQL compiled and working on Cygwin, and got a simple test example from online to verify that it worked. The test example compiled and ran successfully.

However, when incorporating MySQL in a hobby project of mine it isn't compiling which I believe is due to how the Makefile is setup, I have no experience with Makefiles and after reading tutorials about them, I have a better grasp but still can't get it working correctly.

When I try and compile my hobby project I recieve 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 building the source before I attempted to put in MySQL support into the project. The LIBMYSQL paths are correct, verified 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 spitting out all the arguments etc, it just spits out the "Compiling [Filename]" etc.

If I add -c to the L_FLAGS then it compiles (I think) but instead spits out stuff like:

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

After a full day of trying and research on google, I'm no closer to solving my problem, so I come to you guys to see if you can explain to me why all this is happening and if possible, steps to solve.

Regards, Steve

like image 287
Steve Avatar asked May 28 '10 09:05

Steve


People also ask

Why do we use makefile in C?

Makefile is a set of commands (similar to terminal commands) with variable names and targets to create object file and to remove them. In a single make file we can create multiple targets to compile and to remove object, binary files. You can compile your project (program) any number of times by using Makefile.

Is a makefile necessary?

A makefile is useful because (if properly defined) allows recompiling only what is needed when you make a change. In a large project rebuilding the program can take some serious time because there will be many files to be compiled and linked and there will be documentation, tests, examples etc.


2 Answers

Try changing

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

to

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

The linker searches and processes libraries and object files in the order they are specified. Thus when you mention the libraries before the object files, the functions used in the object files may not be loaded from the libraries.

like image 192
Dmitry Yudakov Avatar answered Sep 23 '22 22:09

Dmitry Yudakov


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

like image 23
Chris Tonkinson Avatar answered Sep 25 '22 22:09

Chris Tonkinson