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 にインストールし (それが役に立たなかったので明白な理由はありません)、LD PATH を編集しようとしました (私は Linux に非常に慣れていないので、それがうまくいったかどうかわかりません)。ものですが、このことはうまくいかないようです。どんな助けでも感謝します。

4

2 に答える 2

1

プログラムをリンクすると、makefileに関する1つの問題が発生します。g ++を使用したこれらの 質問でわかるように、リンク時の引数の順序は非常に重要です。ライブラリはオブジェクトファイルの後に置く必要があります。LDFLAGS解決する簡単な方法の1つは、リンカーフラグ( )をコンパイラフラグ()から分離し、linkコマンドで(オブジェクトファイル)の後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

コンパイラーがリンカーを呼び出すことになっているときにコンパイラーに与える追加のフラグ ld( -L. 代わりに、ライブラリ ( -lfoo) を LDLIBS 変数に追加する必要があります。

したがって、この場合-lboost_regex、LDFLAGS ではなく、LDLIBS に設定または追加する必要があります。

于 2016-06-05T16:08:44.257 に答える