找不到静态库中定义的函数

时间:2017-01-24 00:04:11

标签: c makefile

我在查找get_offsets()中定义的名为bam_sqlite.c的函数时遇到问题。

我创建了一个包含以下Makefile的静态库:

CC    = gcc
CFLAGS = -Wall -g -std=c99 -fPIC
INC := -Iinclude -I./ -I/gpfs/commons/home/knagdimov/temp/git/Rbamdb/htslib/ -I/gpfs/commons/home/knagdimov/temp/git/Rbamdb/lmdb/libraries/liblmdb/ -I/gpfs/commons/home/knagdimov/temp/git/Rbamdb/sqlite3/

all:

    @mkdir -p bin 
    $(CC) $(CFLAGS) $(INC) -c bamdb.c -o bin/bamdb.o
    $(CC) $(CFLAGS) $(INC) -c src/bam_api.c -o bin/bam_api.o
    $(CC) $(CFLAGS) $(INC) -c src/bam_lmdb.c -o bin/bam_lmdb.o
    $(CC) $(CFLAGS) $(INC) -c src/bam_sqlite.c -o bin/bam_sqlite.o
    ar -rcs bin/libbamdb.a bin/bamdb.o bin/bam_api.o bin/bam_lmdb.o bin/bam_sqlite.o

然后,我运行nm libbamdb.a并获得以下输出:

bam_sqlite.o 
000000000000067b T get_offsets

因此,该函数在静态库中定义。最后,我运行另一个Makefile(在更高的目录中),其中包含以下内容:

PKG_BASE = $(shell pwd)/../
LIB_BASE = -Wl,-rpath,$(PKG_BASE)
PKG_CPPFLAGS = -I$(PKG_BASE)bamdb -I$(PKG_BASE)Rbamdb -I$(PKG_BASE)bamdb/include/ -I$(PKG_BASE)htslib/ -I$(PKG_BASE)lmdb/libraries/liblmdb/ -I$(PKG_BASE)sqlite3/
PKG_CXXFLAGS = -I$(PKG_BASE)badb -I$(PKG_BASE)Rbamdb -I$(PKG_BASE)bamdb/include/ -I$(PKG_BASE)htslib/ -I$(PKG_BASE)lmdb/libraries/liblmdb/ -I$(PKG_BASE)sqlite3/
PKG_LIBS = -L$(PKG_BASE)/ -L$(PKG_BASE)/bamdb/bin/ -L$(PKG_BASE)htslib/ -L$(PKG_BASE)lmdb/libraries/liblmdb/ -L$(PKG_BASE)sqlite3/ -lbamdb -lhts -llmdb -lsqlite3

其他库是libsqlite3.so,libhts.a,liblmdb.a,它们似乎都可以找到。唯一没有找到的是libbamdb.a,这让我相信我是以错误的方式定义静态库。

请注意,bamdb源代码(bam_api.c,bam_lmdb.c,bam_sqlite.c,bam_sqlite.c)依赖于其他静态库中定义的函数。我是否应该将它们包括在内我将这些源代码编译成目标文件?

最终以下解决了这个问题:Makevars文件正在使用g ++编译器创建一个.so文件。以前的库是使用gcc编译的C库。 C源代码的头文件不包含以下内容:

#ifdef __cplusplus 
 extern "C" { 
 #endif 
 #ifdef __cplusplus
}

包括那解决了问题。

1 个答案:

答案 0 :(得分:1)

如果您正在使用gcc和gnu链接器,那么-l命令行参数的这种描述可能会有所帮助

  

链接器将仅在存档位置搜索一次存档   在命令行中指定。如果存档定义了符号   在归档之前出现的某个对象中未定义   在命令行上,链接器将包含相应的文件   来自档案馆。但是,出现的对象中存在未定义的符号   稍后在命令行上不会导致链接器搜索   再次存档。

     

请参阅 - (用于强制链接器搜索存档的方法的选项)   多次。

因此,如果对get_offsets()的引用来自-lbamdb之后的-l库之一,则需要重新排列-l或使用 - ( - )。