我在查找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
}
包括那解决了问题。
答案 0 :(得分:1)
如果您正在使用gcc和gnu链接器,那么-l命令行参数的这种描述可能会有所帮助
链接器将仅在存档位置搜索一次存档 在命令行中指定。如果存档定义了符号 在归档之前出现的某个对象中未定义 在命令行上,链接器将包含相应的文件 来自档案馆。但是,出现的对象中存在未定义的符号 稍后在命令行上不会导致链接器搜索 再次存档。
请参阅 - (用于强制链接器搜索存档的方法的选项) 多次。
因此,如果对get_offsets()的引用来自-lbamdb之后的-l库之一,则需要重新排列-l或使用 - ( - )。