environment
- ubuntu 18.04 64bit
- g c c 7.5.0
Introduction
undefined reference to
is a classic problem in c/c++
programming, and it is often encountered in actual project development. This article uses some examples to see how similar problems are solved.
Preparation
Prepare 3 files here, the project entry file main.c
, the called function is placed in sub.c
, and there is also a header file sub.h
sub.h
file
#ifndef __SUB_H__ #define __SUB_H__ void sub(); #endif
sub.c
file
#include <stdio.h> void sub() { printf("This is sub.\n"); }
main.c
file
#include <stdio.h> #include "sub.h" int main() { printf("This is main.\n"); sub(); return 0; }
case one
Let’s look at the first case first. We compile the source code files into object files one by .o
gcc -c sub.c gcc -c main.c
Next, compile main.o
into the executable file main
gcc -o main main.o
At this time, an error was reported, indicating that the sub
method could not be found.
In the face of this situation, adding sub.o
and compiling together can solve the problem
gcc -o main main.o sub.o
Or more directly, a command directly in place
gcc -o main main.c sub.c
In fact, most projects use Makefile
to organize compilation rules, which is very rare.
case two
In project development, it is inevitable to use third-party libraries. At this time, undefined reference to
problems are also prone to occur. Let’s take a look
Compile sub.c
into a static library
gcc -c sub.c ar -rc libsub.a sub.o
Next, compile the executable
gcc -o main main.c
It can be seen that since we have not linked the static library libsub.a
, we cannot find the sub
method. Here, adding libsub.a
can make the problem disappear
gcc -o main main.c libsub.a
If another static library is called in the called static library, just add it in the same way, and I will not give an example here. It should be noted that the order of library linking is very particular, and undefined reference to
will appear if the order is wrong. Libraries that depend on other libraries must be placed in front of the dependent library.
The same applies to dynamic libraries as above.
Generic Makefile template
Here is a basic Makefile
template file for your reference
CC = gcc DEBUG =-DUSE_DEBUG CFLAGS =-Wall SOURCES =$(wildcard ./src/*.c) INCLUDES =-I./include LIB_NAMES = -lz -lm -lrt -ldl -lpthread LIB_PATH =-L./shared_libs OBJ =$(patsubst %.c, %.o, $(SOURCES)) TARGET = main #links $(TARGET):$(OBJ) @mkdir -p build $(CC) $(OBJ) $(LIB_PATH) $(LIB_NAMES) static_libs/libsub.a static_libs/libother.a -o build/$(TARGET) @rm -rf $(OBJ) #compile %.o: %.c $(CC) $(INCLUDES) $(DEBUG) -c $(CFLAGS) $< -o $@ .PHONY:clean clean: @echo "Remove linked and compiled files......" rm -rf $(OBJ) $(TARGET) build
Common Error Solving
undefined reference to `dlopen' undefined reference to `dlerror' undefined reference to `dlsym' undefined reference to `dlclose'
Workaround, -ldl
undefined reference to `timer_create' undefined reference to `timer_settime'
Workaround, -lrt
This article is transferred from https://xugaoxiang.com/2023/01/09/c-undefined-reference-to/
This site is only for collection, and the copyright belongs to the original author.