我正在尝试编译一个项目(在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'
答案 0 :(得分: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
个选项。
答案 1 :(得分:-1)
如果您有源文件,请在64平台中编译并生成.so然后链接。 否则使用-m32编译。它会起作用