'неопределенная ссылка на' функцию ' - PullRequest
0 голосов
/ 14 марта 2019

Я скачал библиотеку libcomplearn и хочу проверить ее в небольшом примере программы.Но когда я связываю его, я получаю неопределенную ссылку об ошибке на 'function'.

Я установил библиотеку по определенному пути.

ОС: Debian

test.c

#include <stdio.h>
#include "complearn.h"
#include "complearn/complearn-ncd.h"

int main(const int argc, const char * const argv[])
{
    printf("Number from my library\n");

    CompLearnNcd *ncd = complearn_ncd_top();
    return 0;
}

Makefile

FILES = test
LIBPATH = /try/libcomplearn/lib/pkgconfig
OUTPUT = TK_1
LIBNAME = complearn
#--------------------------------------------------

CC = gcc

CFLAGS = -c -Wall `export PKG_CONFIG_PATH=$(LIBPATH) && pkg-config --cflags $(LIBNAME)`
LDFLAGS = -static `export PKG_CONFIG_PATH=$(LIBPATH) && pkg-config --libs --static $(LIBNAME) -llzma`

all: Release

Debug: CFLAGS += -g
Debug: $(OUTPUT)

Release: $(OUTPUT)

$(OUTPUT): $(OUTPUT).o
    @echo "started...."
    $(CC) -o $(OUTPUT) $(OUTPUT).o $(LDFLAGS)
    @echo "done...."

$(OUTPUT).o: $(FILES).c
    $(CC) $(CFLAGS) $(FILES).c -o $(OUTPUT).o

clean:
    rm -f $(OUTPUT).o $(OUTPUT)

Выход

gcc -c -Wall `export PKG_CONFIG_PATH=/try/libcomplearn/lib/pkgconfig && 
pkg-config --cflags complearn` test.c -o TK_1.o
test.c: In function ‘main’:
test.c:9:19: warning: unused variable ‘ncd’ [-Wunused-variable]
 CompLearnNcd *ncd = complearn_ncd_top();
               ^~~
started....
gcc -o TK_1 TK_1.o -static `export                 
PKG_CONFIG_PATH=/try/libcomplearn/lib/pkgconfig && pkg-config --libs --    
static complearn -llzma`
Unknown option -llzma
/usr/bin/ld: TK_1.o: in function `main':
test.c:(.text+0x1c): undefined reference to `complearn_ncd_top'
collect2: error: ld returned 1 exit status
make: *** [makefile:28: TK_1] Error 1

Я также пробовал скоманда:

gcc test.c `-L/try/libcomplearn/lib/ -llzma` `pkg-config --cflags --libs glib-2.0` 

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Вы говорите:

Я также пытался с помощью команды:

gcc test.c `-L/try/libcomplearn/lib/ -llzma` `pkg-config --cflags --libs glib-2.0`

, которая означает, что вы не понимаете обратные тики , поскольку:

`-L/try/libcomplearn/lib/ -llzma`

не имеет смысла их использовать.Не торопитесь, чтобы изучить их использование.

Причиной сбоя связывания является настройка:

LDFLAGS = -static `export PKG_CONFIG_PATH=$(LIBPATH) && pkg-config --libs --static $(LIBNAME) -llzma`

в файле makefile.

Здесь у вас есть -llzma в расширении обратного тика:

`export PKG_CONFIG_PATH=$(LIBPATH) && \
    pkg-config --libs --static $(LIBNAME) -llzma`

Чтобы развернуть это, оболочка выполняет:

export PKG_CONFIG_PATH=$(LIBPATH)
pkg-config --libs --static $(LIBNAME) -llzma

-llzma - бессмысленная опция для команды pkg-config, поэтому она терпит неудачу, как вы видите, жалуется в make output:

Unknown option -llzma

Точно так же, как:

$ pkg-config --cflags --libs zlib -llzma
Unknown option -llzma

В результате требуемые параметры связывания, которые должны выводиться с помощью:

pkg-config --libs --static $(LIBNAME)

, не являютсявыход и не интерполируются в значение LDFLAGS.Таким образом, связь не выполняется:

test.c:(.text+0x1c): undefined reference to `complearn_ncd_top'

, поскольку libcomplearn не было связано.Исправьте настройку вашего LDFLAGS в:

LDFLAGS = -static `export PKG_CONFIG_PATH=$(LIBPATH) && pkg-config --libs --static $(LIBNAME)` -llzma

с помощью -llzma после расширения обратной галочкой.

0 голосов
/ 14 марта 2019

С Почему порядок, в котором связаны библиотеки, иногда вызывает ошибки в GCC?

Порядок параметров -l очень важен. Просто передайте -llzma в качестве последней опции связывания.

...