简体   繁体   中英

Undefined reference to function that is already defined in my header file

I have three files, posl.h , state.c and main.c . What I plan on doing is adding functions that are used throughout the project in posl.h , and then I call it to test the function with main.c , and then make the function in state.c . The problem I am having is that I keep getting an error of undefined reference to init_poslState() even though I have it defined in posl.h

main.c

#include <posl.h>

int main(int argc, char * argv[]) {
    pState poslState = init_poslState();
    return 0;
}

posl.h

#ifndef POSL_LANGUAGE_H
#define POSL_LANGUAGE_H

#define POSL_MAJOR_VERSION 1
#define POSL_MINOR_VERSION 0
#define POSL_RELEASE_VERSION 0

// State
typedef struct POSL_STATE {
    // ...
} pState;
pState init_poslState();
void free_poslState(pState poslState);

#endif

state.c

#include "state.h"
#include <posl.h>

pState init_poslState() {
    pState newState;
    return newState;
}

Makefile

CFLAGS=-g -Wall -Wextra -I./include
CC=gcc $(CFLAGS)
CORE_O_FILES=./src/Core/lexer.o ./src/Core/parser.o ./src/Core/state.o
CLI_O_FILES=
O_FILES=$(CORE_O_FILES)

# Making CLI Tool
posl: $(CLI_O_FILES) libposl.a ./src/CLI/main.c
    $(CC) -o posl -L./ -lposl ./src/CLI/main.c $(CLI_O_FILES)

# Making Library
libposl.a: $(O_FILES) ./include/posl.h
    ar rcs libposl.a $^


# Core Files
./src/Core/lexer.o: ./src/Core/lexer.c ./src/Core/lexer.h
    $(CC) -o $@ -c ./src/Core/lexer.c
./src/Core/parser.o: ./src/Core/parser.c ./src/Core/parser.h
    $(CC) -o $@ -c ./src/Core/parser.c
./src/Core/state.o: ./src/Core/state.c ./src/Core/state.h
    $(CC) -o $@ -c ./src/Core/state.c

# PHONY List

.PHONY: all
all:
    make update-libs
    make libposl.a
    make posl
    make pcc

# Post-Compile Clean
.PHONY: pcc
pcc:
    rm -rf ./src/Core/*.o
    rm -rf ./src/CLI/*.o

.PHONY: clean
clean:
    make pcc
    rm -rf ./libposl.a ./posl*

The order of compiler and (especially) linker options is significant. With this command...

 $(CC) -o posl -L./ -lposl./src/CLI/main.c $(CLI_O_FILES)

... the linker will not attempt to resolve any function references from main.c against functions in libposl.a. It will look only to objects and libraries appearing after main.c on the command line.

Therefore, rewrite that recipe to

     $(CC) -o posl -L. ./src/CLI/main.c $(CLI_O_FILES) -lposl

Welp, @user17732522 answered my question. I had the -l flag messed up, and it wasn't after my source files. ~Thank you guys!~

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM