gpt4 book ai didi

C编译错误,未找到外部库函数

转载 作者:行者123 更新时间:2023-11-30 15:37:11 25 4
gpt4 key购买 nike

我正在尝试编译一个项目(在 32 位操作系统 Ubuntu 上编写)。我正在使用给定的 makefiles 并安装了所有必要的外部库(在 64 位 Ubuntu 上)。

我没有收到库链接错误,但无法识别 SDLargtable2(外部库)中实现的函数。我仅更改了 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;
}

生成文件如下所示:

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'

最佳答案

指定库的选项需要在使用给定库中的符号的对象之后进入命令行。

所以这个命令:

 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 选项放在链接命令的末尾。

关于C编译错误,未找到外部库函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22298308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com