automake 将目标文件放在库之后

Posted

技术标签:

【中文标题】automake 将目标文件放在库之后【英文标题】:automake putting object files after libraries 【发布时间】:2020-10-09 02:58:23 【问题描述】:

src/Makefile.am:

myproj_CXXFLAGS = -fopenmp -O3 -std=c++17 -g -I/home/software/miniconda3/include -I$(top_srcdir)/external
myproj_LDFLAGS = -L/home/software/miniconda3/lib -Wl,-rpath=/home/software/miniconda3/lib -fopenmp -lz -ligraph -pthread 
bin_PROGRAMS = myproj
myproj_SOURCES = gfa.cpp  graph.cpp myproj.cpp gfa.h  graph.h
bindir = $(top_srcdir)/bin

这可以很好地构建目标文件,但是在构建目标时,它会尝试运行

g++ -fopenmp -O3 -std=c++17 -g -I/home/software/miniconda3/include -I../external -g -O2 -L/home/software/miniconda3/lib -Wl,-rpath=/home/software/miniconda3/lib -fopenmp -lz -ligraph -pthread   -o myproj myproj-gfa.o myproj-graph.o myproj-komb.o 

这个问题是目标文件在库文件之后,这会导致错误

/home/software/miniconda3/lib/libz.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

我可以通过在最后添加 -lz -ligraph 标志来轻松解决此问题,但是如何让 automake 在目标文件之后而不是之前添加 LDFLAGS

【问题讨论】:

【参考方案1】:

那是因为您使用了错误的变量。要传递库,您应该使用myproj_LDADD,而不是myproj_LDFLAGS

【讨论】:

以上是关于automake 将目标文件放在库之后的主要内容,如果未能解决你的问题,请参考以下文章

使用 automake 将头文件放在 /usr/include 的子目录中?

Automake 无法识别 Objective-C/C++

makefile.am 变量在 make 命令中的目标文件之后设置一些库

《程序员自我修养》阅读笔记-静态链接

目标文件里的秘密

预处理 动态库静态库