我得到了一项改善某些代码运行时间的任务。唯一的问题是,我甚至无法将其编译为首先在我的机器上运行它。每次我尝试,它都会在编译过程中停在某处说:
“未定义的引用`boost :: re_detail :: put_mem_block(void *)' collect2:ld返回1退出状态make: * [cpu]错误1“
这就是makefile的外观:
SHELL = /bin/bash
OBJECTS = main.o atom.o molecule.o charges.o pdb.o asa.o amino.o chain.o addition.o string_operation.o pdb_peptide.o protein_chain.o residue_atom.o chain_residue.o residue_contact.o atom_grid.o circles.o atom_space_calculations.o
OBJDIR = obj
VPATH = src:src/ext:$(OBJDIR)
CFLAGS = -O3 -Wall -lm -lboost_regex -L/usr/local/boost/lib
HDIRS = src,src/ext,src/qt_redistributable, usr/lib, usr/local/lib, usr/local/lib/include/boost, /usr/local/lib/lib/
IOPTS = $(addprefix -I, $(HDIRS))
cpu : $(addprefix $(OBJDIR)/, $(OBJECTS) $(CPUOBJS))
g++ $(CFLAGS) -o mcpu $^
$(OBJDIR)/%.o : %.cpp
g++ $(CFLAGS) $(IOPTS) -c $< -o $@
clean :
rm obj/*.o $(PROG)
我正在使用Linux Mint x64,我已经尝试了所有我用Google搜索的内容。在usr / local / lib中安装了整个boost库(没有明显的原因,因为它没有帮助),试图编辑LD PATH(我对Linux很新,我不知道是否正确)和很多东西,但这件事似乎没有通过。任何帮助表示赞赏。
答案 0 :(得分:1)
链接程序时,makefile会出现一个问题。正如您在these questions中使用g ++所看到的那样,链接时参数的顺序非常重要。您需要将库放在目标文件之后。一种简单的解决方法是将链接器标志(LDFLAGS
)与编译器标志(CFLAGS
)分开,然后将LDFLAGS
放在$^
(您的目标文件)之后链接命令。
CFLAGS = -O3 -Wall
LDFLAGS = -L/usr/local/boost/lib -lm -lboost_regex
cpu : $(addprefix $(OBJDIR)/, $(OBJECTS) $(CPUOBJS))
g++ $(CFLAGS) -o mcpu $^ $(LDFLAGS)
$(OBJDIR)/%.o : %.cpp
g++ $(CFLAGS) $(IOPTS) -c $< -o $@
答案 1 :(得分:0)
链接单个目标文件
n
是通过运行链接器(通常称为n.o
自动生成的ld
)通过C编译器。使用的精确配方是:$(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)
和Variables Used by Implicit Rules:
LDFLAGS
当编译器应该调用链接器时给出的额外标志,
ld
,例如-L
。应将库(-lfoo
)添加到LDLIBS变量中 代替。
因此,在这种情况下,应将-lboost_regex
设置或添加到LDLIBS,而不是LDFLAGS。