0

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

“对`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,并且我已经尝试了我搜索的所有内容。在 usr/local/lib 中安装了整个 boost 库(没有明显的原因,因为它没有帮助),尝试编辑 LD PATH(我对 Linux 非常陌生,我不知道这是否正确)和很多东西,但这件事似乎没有通过。任何帮助表示赞赏。

4

2 回答 2

1

当您链接您的程序时,您的 makefile 会出现一个问题。正如您在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 $@
于 2012-09-20T08:07:00.300 回答
0

从内置规则目录中可以看出:

链接单个目标文件

n通过 C 编译器n.o运行链接器(通常称为 )自动生成。ld使用的精确配方是:

$(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)

隐式规则使用的变量

LDFLAGS

Extra flags to give to compilers when they are supposed to invoke the linker, ld, such as -L. Libraries (-lfoo) should be added to the LDLIBS variable instead.

So in this case -lboost_regex should be set or added to LDLIBS, not LDFLAGS.

于 2016-06-05T16:08:44.257 回答