“对功能的未定义引用”

时间:2019-03-14 09:13:12

标签: c makefile compiler-errors linker-errors

我已经下载了libcomplearn库,并希望在一个小的示例程序中对其进行测试。但是,当我链接它时,我得到了错误的“功能”的未定义引用。

我将库安装到特定路径。

操作系统: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;
}

制作文件

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

答案 0 :(得分:1)

您说:

  

我也尝试了以下命令:

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

表示您不了解back-ticks, 由于:

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

并不是对它们的有意义的使用。现在花一些时间来学习它们的用法。

设置失败的原因是:

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

在生成文件中。

在这里,您有-llzma属于反引号扩展名:

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

要对此进行扩展,shell将执行:

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

-llzmapkg-config命令的毫无意义的选项,因此它失败了, 如您在make输出中看到的那样:

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

答案 1 :(得分:0)

来自Why does the order in which libraries are linked sometimes cause errors in GCC?

-l选项的顺序非常重要。只需将-llzma作为最后一个链接选项即可。