无法使用makefile编译 - 未定义的引用`boost :: re_detail

时间:2012-09-20 06:48:51

标签: linux boost reference undefined mint

我得到了一项改善某些代码运行时间的任务。唯一的问题是,我甚至无法将其编译为首先在我的机器上运行它。每次我尝试,它都会在编译过程中停在某处说:

  

“未定义的引用`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很新,我不知道是否正确)和很多东西,但这件事似乎没有通过。任何帮助表示赞赏。

2 个答案:

答案 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)

Catalogue of Built-In Rules

中可以看出
  

链接单个目标文件

     

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。