Ошибка компиляции C, функции внешней библиотеки не найдены
Я пытаюсь скомпилировать проект (который написан на 32-битной ОС, Ubuntu). Я пользуюсь данным makefiles
и я установил все необходимые внешние библиотеки (на 64-битной Ubuntu).
Я не получаю ошибку компоновки библиотеки, но функции, реализованные в SDL
а также argtable2
(внешние библиотеки) не распознаются. Я только изменил путь к libSDL_gfx.so
так что это указывает на 64-битную установку.
Как я могу решить эту проблему компиляции?
Код:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <argtable2.h>
#include "../../problems/generative_model.h"
#include "../../problems/viewer.h"
#include "opcas.h"
int main(int argc, char* argv[]) {
double discountFactor;
unsigned int maxNbEvaluations;
char isTerminal = 0;
char isDisplayed = 1;
char verbose = 0;
unsigned int nbTimestep = 0;
double L;
opcas_instance* instance = NULL;
state* crtState = NULL;
state* nextState = NULL;
double reward = 0.0;
double* optimalAction = NULL;
struct arg_dbl* g = arg_dbl1("g", "discountFactor", "<d>", "The discount factor for the problem");
...
return EXIT_SUCCESS;
}
Makefile выглядит так:
CC := gcc
FLAGS := -W -Wall -g -ansi -std=c99 -pedantic
LIBS := -lm -lSDL -lSDLmain /usr/lib/x86_64-linux-gnu/libSDL_gfx.so -largtable2
BIN_DIR := bin
OBJ_DIR := obj
all: $(BIN_DIR)/opcas_ball $(BIN_DIR)/opcas_inverted_pendulum
$(BIN_DIR)/opcas_mountain_car $(BIN_DIR)/opcas_acrobot $(BIN_DIR)/opcas_spring_pendulum
$(BIN_DIR)/opcas_ball: $(OBJ_DIR)/opcas_1.o $(OBJ_DIR)/main_opcas_1.o $(OBJ_DIR)/ball.o $(OBJ_DIR)/viewer_ball.o $(OBJ_DIR)/opcas_drawing_procedure_ball.o $(OBJ_DIR)/svgFile.o
$(CC) $(FLAGS) $(LIBS) $^ -o $@
Ошибка (аналогичная ошибка для функций SDL):
gcc -W -Wall -g -ansi -std=c99 -pedantic -lm -lSDL -lSDLmain /usr/lib/x86_64-linux-
gnu/libSDL_gfx.so -largtable2 obj/opcas_1.o obj/main_opcas_1.o obj/ball.o
obj/viewer_ball.o obj/opcas_drawing_procedure_ball.o obj/svgFile.o -o bin/opcas_ball
obj/main_opcas_1.o: In function `main':
/home/elod/UTwork/RealTime_Cpp/continuous_action_space/algorithms/opcas/main_opcas.c:63: undefined reference to `arg_dbl1'
2 ответа
Параметры, указывающие библиотеки, должны входить в командную строку после объекта, используя символы из заданных библиотек.
Итак, эта команда:
gcc -W -Wall -g -ansi -std=c99 -pedantic -lm -lSDL -lSDLmain /usr/lib/x86_64-linux-gnu/libSDL_gfx.so -largtable2 obj/opcas_1.o obj/main_opcas_1.o obj/ball.o obj/viewer_ball.o obj/opcas_drawing_procedure_ball.o obj/svgFile.o -o bin/opcas_ball
должен выглядеть так
gcc -W -Wall -g -ansi -std=c99 -pedantic /usr/lib/x86_64-linux-gnu/libSDL_gfx.so obj/opcas_1.o obj/main_opcas_1.o obj/ball.o obj/viewer_ball.o obj/opcas_drawing_procedure_ball.o obj/svgFile.o -o bin/opcas_ball -lm -lSDL -lSDLmain -largtable2
Как правило, это будет работать почти во всех случаях: Место -lxyz
параметры в конце команды ссылки.
Если у вас есть исходные файлы, скомпилируйте их на платформе 64 и создайте.so, а затем создайте ссылку. Остальное скомпилировать с -m32. Это будет работать