【问题标题】:Undefined reference to functions included by a lib对库中包含的函数的未定义引用
【发布时间】:2019-11-22 02:50:25
【问题描述】:

我有一个库,其中包含一个文件(此处称为 Util.c),我正在尝试使用此文件中定义的一些函数来编译一个小程序。我已经在使用 lib 中的其他函数,但是这个特定文件中的函数总是给我一个“未定义的引用”。真正奇怪的是:lib 中的其他函数确实使用了 Util.c 中的函数,而且效果很好。只是……我不能直接使用它们。

我会尽量让你清楚地了解这里的情况:

Util.c

void foo (void *var){
    print ("in Foo!");
}

void *bar (int var){
    print ("in bar!");
}

Util.h:

#ifndef UTIL_DEFINED
#define UTIL_DEFINED

void foo(void *var)
void *bar(int var)

#endif

libobj.c:

#include "Util.c"
// #include "a lot of other files.c"

MyFile.c:

#include "Util.h"
// #include "others headers from the lib which functions are working well"

int main(){
//here i use the lib's function without a prob, except for the ones coming from Util.c, namely foo and bar. For example: 

int *var;
//Say that LibFunc is another function from the lib, but not from Util.c. 
//Libfunc make a call to foo, and it's working well. 
Libfunc(var);

//However, here i try to use foo or bar, and i get the undefined reference!
foo(var);

bar(var);

}

Makefile 是一件大事,但如果我只搜索与 lib 相关的部分,它看起来像这样:

Lib Makefile

default: $(LIB)
$(LIB): $(LIBOBJ)
    -$(RM) "$@"
    $(DLLD) -o "$@" $(DLLDFLAGS) "$(LIBOBJ)"
$(LIBOBJ): libobj.c $(LIBSRC) $(LIBINC)
    $(CC) -c $(LOTOFFLAGS) libobj.c -o "$@"

LIBSRC: libobj.c\
    aBunchOfOtherFiles.c
LIBINC: Util.h\ 
    ABunchOfHeadersFiles.h 

LIBOBJ=$(LIBNAME)dll.o
LIB=$(LIBNAME).dll


CC= gcc
DLLD = gcc -shared -fprofile-arcs -ftest-coverage -fprofile-generate
DLLDFLAGS = -fPIC
LOTOFFLAGS = -Wall -pedantic -Wno-long-long -Wno-unused-function -g -g3 -ggdb -std=c99 --coverage -fprofile-arcs -ftests-coverage -fprofile-generate -Wl,--allow-multiple-definition -fPIC $(IFLAGS)
#IFLAGS include all headers files, as well as some info concerning Lib version, OS, PROC, etc... not so important here. 
IFLAGS = -I$(FOLDERS) -DWINDOWS
FOLDERS= MyFolders
LIBNAME = MyLibName

RM= del

最后,我的 makefile 看起来像这样:

我的 Makefile

default: $(PROG_EXE)

$(PROG_EXE) : $(LIB) $(PROG_OBJ) 
    $(CC) $(SOMEFLAGS) $(PROG_OBJ) "$(LIB)" -o "$@"
$(PROG_OBJ) : MyFile.c $(LIBINC)
    $(CC) -c $(SOMEFLAGS) -$(IFLAGS) MyFile.c -o "$@"

LIB = $(LIBNAME).dll
LIBINC = Util.h\
    ABunchOfHeadersFiles.h 

PROG_EXE= MyProg
PROG_OBJ = MyProg.o

CC= gcc
SOMFLAGS = -Wall -std=c99 -pedantic -g -g3 - ggb -fprofile-arcs -ftests-coverage 
#IFLAGS basically include all folders containing source code and headers. Also gives some D, such as OS, PROC or the lib version. Not really important for my prob. 
IFLAGS = -I$(FOLDERS) -DWINDOWS 
FOLDERS = MyFolders
LIBNAME = MyLibName

请注意,我没有做任何这些。我只是应该让它工作......

我已经尝试获得所有的标志(认为我得到了所有的标志)。其中一些仅用于 gcov,其他仅用于包含好的文件夹和文件。我已经检查过: Util.c 和 Util.h 已正确包含在这些文件中。顺便说一句,当我编译 MyProg 时,我在 Util.h 上没有“找不到文件”错误,所以它被发现了。

另外,我看到 foo 应该得到一个 void* 并且实际上被赋予了一个 int*。但我认为这不是问题所在,因为当我直接使用 Util.c 编译 MyProg 时,无需尝试从 lib 中获取它,它运行良好。

所以我真的认为,不知何故,我的 prog 在 lib 中找不到函数。但是它确实很好地找到了标头,并且确实很好地找到了 lib 中的其他函数,并且这些函数使用了 Util.c 中的函数,所以我就是不明白:'( 另外,我尝试在没有 Util.c 的情况下编译 lib,以确保 lib 真正使用它。然后我得到了相同的“未定义引用”,所以似乎该库正确包含 Util.c

PS:我在 Windows 32 位,如果有任何用处...

【问题讨论】:

  • 这将有助于在您的问题中查看为您的程序和库执行的确切链接器命令行。
  • 您需要发布您正在使用的实际代码。您发布的代码无法编译,因为它包含许多语法错误。
  • 我无法发布实际代码。首先,因为它太大了,我花了几个小时来获取与我的问题相关联的文件并摆脱其他一切,其次因为代码在没有互联网的 PC 上,我不允许移动它,第三是保密.但是,我试图使其最小化和可执行。
  • 我发现我正在使用的另一个 Lib 函数确实对 Util.c 中的函数进行了一些调用,并且有效。我如何使用 lib 的函数,它使用 Util.c 的函数(也在 lib 中),但我不能直接使用 Util.c 的函数?这对我来说完全没有意义。

标签: c dll linker undefined-reference


【解决方案1】:

我认为错误来自 libobj.c 文件:

#include Util.c

引号不见了:

#include "Util.c"

一般来说,我们#include .h 而不是 .c.

【讨论】:

  • 抱歉,不,这只是我的一个错字。我也从未见过这样的 .c 包含,不知道它是如何工作的。这个文件实际上只是一堆带有 .c 的#include,仅此而已:/
【解决方案2】:

即使我仍然无法理解问题所在,我已经找到了一种使它起作用的方法。

看来,在使用 Mingw 的 Windows 中,您必须在要从 dll 外部使用的每个函数前面添加 __declspec( dllexport )

所以,如果我以这种方式更改我的 Util.c:

`__declspec( dllexport ) void foo (void *var){
    print ("in Foo!");
}

`__declspec( dllexport ) void *bar (int var){
    print ("in bar!");
}

我认为这个库以某种方式设置为具有“公共”和“私有”功能;到目前为止,我只是使用公共的,而 Util.c 中的那些是私有的。这是我看到的唯一解释,即使我不知道如何将函数设为私有或公开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多