c - 对库中包含的函数的未定义引用
问题描述
我有一个包含一个文件的库(此处称为 Util.c),我正在尝试使用该文件中定义的一些函数来编译一个小程序。我已经在使用 lib 中的其他函数,但是这个特定文件的函数总是给我一个“未定义的引用”。真正奇怪的是:lib 中的其他函数确实使用了 Util.c 中的函数,而且效果很好。只是……我不能直接使用它们。
我将尝试让您清楚地了解这里的情况:
实用程序
void foo (void *var){
print ("in Foo!");
}
void *bar (int var){
print ("in bar!");
}
实用程序.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"
我的文件.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 相关的部分,它看起来像这样:
库生成文件
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 中获取它,它运行良好。
所以我真的认为,不知何故,我的编无法在库中找到函数。但是它确实很好地找到了头文件,并且确实很好地找到了 lib 中的其他函数,并且这些函数使用了 Util.c 中的函数,所以我就是不明白:'( 另外,我试图编译没有 Util.c 的库,只是为了确保该库真正使用它。然后我得到了相同的“未定义引用”,所以似乎该库正确包含 Util.c
PS:我在Windows 32位上,如果有任何用处...
解决方案
我认为错误来自 libobj.c 文件:
#include Util.c
引号不见了:
#include "Util.c"
一般来说,我们#include .h 而不是 .c。
推荐阅读
- video - ffmpeg 分段因浮点异常而失败
- html - 如何在 HTML 中将段落标签对齐到表格的右侧?
- python - 循环给了我相同的矩阵集
- android - 如何防止 Ionic 3 应用程序通过 android 中的硬件后退按钮关闭?
- tweepy - 在 Tweepy 中使用 search_full_archive
- angular - 链式 api 调用并保存初始 api 结果中的数据
- swift - SwiftUI 媒体播放器视图 - 在主视图中嵌入小播放器
- javascript - 我无法在我的 javascript 项目中在 firebase auth 中创建用户。我应该怎么办?
- c# - 在 C# 中使用反射获取方法内的所有方法
- c++ - 为什么虚拟继承会导致指针偏移?