我已经下载了libcomplearn
库,并希望在一个小的示例程序中对其进行测试。但是,当我链接它时,会得到错误的“函数” undefined reference 。
我将库安装到特定路径。
操作系统: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`
最佳答案
你说:
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`
在makefile中。
在反引号扩展中,您具有
-llzma
:`export PKG_CONFIG_PATH=$(LIBPATH) && \
pkg-config --libs --static $(LIBNAME) -llzma`
为了扩展它,shell执行:
export PKG_CONFIG_PATH=$(LIBPATH)
pkg-config --libs --static $(LIBNAME) -llzma
-llzma
是pkg-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
。