【问题标题】:errors compiling a program that uses the WordNet library in C编译使用 C 中的 WordNet 库的程序时出错
【发布时间】:2012-05-04 18:03:12
【问题描述】:

我已成功安装 WordNet 库。现在我正在尝试在程序中使用该库,但我无法构建示例程序。即使库搜索路径正确,我也会收到链接器错误(未定义的引用)。

这是错误:

gcc -g -I/usr/local/WordNet-3.0/include  -o wordnet_sample.o -c wordnet_sample.c
gcc -L/usr/local/WordNet-3.0/lib -lWN -o wordnet_sample wordnet_sample.o
wordnet_sample.o: In function `main':
/home/user/wordnet_sample/wordnet_sample.c:6: undefined reference to `wninit'

这是 Makefile

WORDNET_INSTALL=/usr/local/WordNet-3.0
CFLAGS=-g -I$(WORDNET_INSTALL)/include
LDFLAGS=-L$(WORDNET_INSTALL)/lib -lWN

wordnet_sample: wordnet_sample.o
        gcc $(LDFLAGS) -o wordnet_sample wordnet_sample.o

wordnet_sample.o: wordnet_sample.c
        gcc $(CFLAGS) -o wordnet_sample.o -c wordnet_sample.c

这是示例程序

#include <wn.h>
#include <stdlib.h>
int main(int argc, char **argv) {
    int isOpen = 0 == wninit();
    if (isOpen) {
            printf("wordnet opened!\n");
    }
    else {
            printf("Could not open WordNet dictionary!\n");
    }
    return 0;
}

WordNet 库已安装

[user@local wordnet_sample]$ ls -l /usr/local/WordNet-3.0/lib/
total 180
-rw-r--r-- 1 root root 172344 May  3 15:34 libWN.a
drwxr-xr-x 2 root root   4096 May  3 15:34 wnres

我怀疑我可能需要更多的链接器参数,但我真的不确定。有没有人遇到过这个?有谁知道为什么会发生未定义的引用错误,即使我有正确的库和库搜索路径?

【问题讨论】:

    标签: c wordnet


    【解决方案1】:

    您需要将-c 添加到CFLAGS

    第一个gcc 命令也需要在对象之后有库。你可以把 LDFLAGS 放在最后:

    gcc -o wordnet_sample wordnet_sample.o $(LDFLAGS)
    

    更好的是,有单独的LDFLAGS(链接器选项)和LIBS(要链接的实际库)。所以:

    LDFLAGS=-L$(WORDNET_INSTALL)/lib
    LIBS=-lWN
    ....
    gcc $(LDFLAGS) -o wordnet_sample wordnet_sample.o $(LIBS)
    

    【讨论】:

    • 我已经更新了makefile,但是还是不行。能否麻烦您向我解释一下为什么需要 -c?
    • 什么不完全有效? -c 表示“只编译,不链接”。您的 makefile 结构设计用于在两个单独的阶段进行编译和链接。正如另一个答案中所建议的那样,在一个阶段执行此操作仅适用于具有一两个源文件的小型项目。
    • 感谢您的帮助。我将 Makefile CFLAGS 行更改为: CFLAGS=-g -c -I$(WORDNET_INSTALL)/include 并将其从 wordnet_sample.o 目标中删除(保留其他所有内容)。我仍然以同样的错误告终(未定义对 wninit 的引用)。我想我将不得不阅读 gcc 手册页。
    • 我现在看到了另一个问题。库(-lWN)需要在链接命令中的对象之后指定,所以你需要移动LDFLAGS
    • 好的,非常感谢!这正是我的问题;我需要在目标文件之后列出库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 2016-06-01
    相关资源
    最近更新 更多