【问题标题】:Cannot compile with makefile - undefined reference to `boost::re_detail无法使用 makefile 编译 - 未定义对 `boost::re_detail 的引用
【发布时间】:2012-09-20 06:48:50
【问题描述】:

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

"未定义的对 `boost::re_detail::put_mem_block(void*)' 的引用 collect2: ld 返回 1 退出状态 make: * [cpu] Error 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 非常陌生,我不知道这是否正确)和很多东西,但这件事似乎没有通过。任何帮助表示赞赏。

【问题讨论】:

    标签: linux boost reference undefined linux-mint


    【解决方案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 $@
    

    【讨论】:

    • 标准做法更进一步,将链接器标志从库中分离为LDFLAGSLDLIBS。预处理器和编译器相同:CPPFLAGSCFLAGSCXXFLAGS
    【解决方案2】:

    Catalogue of Built-In Rules中可以看到:

    链接单个对象文件

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

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

    Variables Used by Implicit Rules:

    LDFLAGS

    在应该调用链接器时提供给编译器的额外标志, ld,如-L。应将库 (-lfoo) 添加到 LDLIBS 变量中 而是。

    所以在这种情况下,-lboost_regex 应该设置或添加到 LDLIBS,而不是 LDFLAGS。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-26
      • 2012-02-10
      • 1970-01-01
      • 2013-05-13
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多