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

时间:2014-03-10 10:59:48

标签: c gcc makefile linkage

我正在尝试编译一个项目(在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;
}

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 个答案:

答案 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编译。它会起作用