Q:

Linking/Makefile trouble between 3 .c/.h files and a main

I have 2 .h files that contain definitions for functions, and 2 .c files related to the .h files.  There is a third .c file (not main) that has a header file and wants to use functions from the other 2 .c files.  Using the makefile:
CC=gcc
CFLAGS=-Wall -std=c99 -I headers

main: main.o carFunctions.o
        $(CC) $(CFLAGS) build/main.o build/carFunctions.o -o main
carFunctions.o: source/carFunctions.c
        $(CC) $(CFLAGS) -c  source/carFunctions.c -o build/carFunctions.o
linkedList.o: source/linkedList.c
        $(CC) $(CFLAGS) -c source/linkedList.c -o build/linkedList.o
fileManage.o: source/fileManage.c
        $(CC) $(CFLAGS) -c source/fileManage.c -o build/fileManage.o
main.o: source/main.c
        $(CC) $(CFLAGS) -c source/main.c -o build/main.o
clean:
        rm -i build/*.o

results in the error:
gcc -Wall -std=c99 -I headers -c source/main.c -o build/main.o
gcc -Wall -std=c99 -I headers -c  source/carFunctions.c -o build/carFunctions.o
source/carFunctions.c: In function ‘test’:
source/carFunctions.c:9:9: warning: ‘tes3t’ is used uninitialized in this function [-Wuninitialized]
   tes3t = push(tes3t,"TEST");
         ^
gcc -Wall -std=c99 -I headers build/main.o build/carFunctions.o -o main
build/carFunctions.o: In function `test':
carFunctions.c:(.text+0x15): undefined reference to `push'
collect2: error: ld returned 1 exit status
makefile:5: recipe for target 'main' failed
make: *** [main] Error 1

The three .c files for functions are as follows:
carFunctions.c:
#include <stdio.h>
#include "carFunctions.h"
#include "linkedList.h"
#include "fileManage.h"

void test()
{
  LL* tes3t;
  tes3t = push(tes3t,"TEST");
  printf("it works?"); 
}

fileManage.c:
#include <stdio.h>
#include "fileManage.h"

void test2()
{
  printf("fileman");
}

and linkedList.c:
#include <stdio.h>
#include <stdlib.h>
#include "linkedList.h"

struct LLStruct
{
  char* plateNum;
  struct LLStruct* next;
};

LL* push(LL* myList, char* data)
{
  LL* newNode = malloc(sizeof(LL));
  if(newNode ! = NULL)
  {
    newNode->plateNum = data;
    newNode->next = myList;
    return newNode;
  }
  else
  {
    return myList;
  }
}

The header files:
carFunctions.h:
#ifndef CARFUN
#define CARFUN

void test();

#endif

fileManage.h:
#ifndef FILEMAN
#define FILEMAN

void test2();

#endif

linkedList.h:
#ifndef LINKLIST
#define LINKLIST

typedef struct LLStruct LL; // Defines a structure for linked lists as "LL"
LL* push(LL* myList, char* data); // Adds an item to the linked list
#endif

And finally, main.c:
#include <stdio.h>
#include "carFunctions.h"

int main()
{
  test();
  return 0;
}

I am not really too sure where the error is coming from, as I don't think there are any missing brackets.  It may be the file linking/makefile, but I am not good enough with file linking to check. 

A:

There are actually two things going on here:

First:
source/carFunctions.c: In function ‘test’:
source/carFunctions.c:9:9: warning: ‘tes3t’ is used uninitialized in this function [-Wuninitialized]
   tes3t = push(tes3t,"TEST");

This is showing you that you passed an uninitialized pointer as the first argument to the function push.  Since the pointer is uninitialized, it could contain anything at all, pointing to any arbitrary place in memory, and the behavior of your program when you run it could vary wildly depending on what happens to be at that memory address. 
However, this is a warning, which means it's not ultimately responsible for the failure of your build process. ( Often warnings can show the underlying reasons for more confusing errors that appear later on, so it's good to pay attention to them, though.) 
Second:
build/carFunctions.o: In function `test':
carFunctions.c:(.text+0x15): undefined reference to `push'
collect2: error: ld returned 1 exit status

This is showing you that the linker wasn't able to find the compiled machine code for the function push.  In this case, that's because you simply didn't include the object file which contains that machine code (linkedList.o) in the linker command line.  Under different circumstances, this kind of error can sometimes mean that you made a mistake in the definition of a function and forgot to include the appropriate header file to allow the compiler to catch that mistake.