2016-06-23 4 views
0

以前に作成されたいくつかの静的ライブラリを取り、実行ファイルにリンクするMakefileを作成しようとしました。 1つの図書館にはmainルーチンがあります。Makefile:実行可能ファイルに複数の* .aをリンクする

私はエラーを取得する:

/lib/../lib64/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 
collect2: error: ld returned 1 exit status 
make: *** [dockSIM_gcc_release] Error 1 

私はちょうどmainルーチンを持っていますが、エラーは同じままとmakeを呼び出した後に直接来るライブラリをリンクして、それを試してみました。

のMakefile:

SHELL = /bin/sh 
RM=/bin/rm -f 
CXX=g++ 
PROGNAME=dockSIM_gcc_release 

DEFINES=-DDOCKSIM_VERBOSE=FALSE -DNDEBUG -DPRINT_LOG_MSG=0 -DPRINT_DEBUG_MSG=0 

LDFLAGS = -fopenmp -g -O3 -std=c++11 -mavx -mstackrealign -fstrict-aliasing 

LIBS= -lnagc_mkl -lm -L../externalCode -lpardiso500-GNU481-X86-64 -lacml 

FILENAMES = commandInterpreter_lib.a 

OBJNAMES = 


all: $(PROGNAME) 


$(PROGNAME): $(FILENAMES) 
    $(CXX) $(LDFLAGS) $(DEFINES) -o $(PROGNAME) $(FILENAMES) 


clean: 
    $(RM) *.mo *.ho *.o $(PROGNAME) core *~ 

test: 
    echo $(FILENAMES) 
showlibs: 
    echo $(LIBS) 

フラグは、コードをコンパイルするために使用されたものと互換性があります。

g ++4.9.3が使用される。メインルーチンの

署名:ヘルプとよろしくため

int main(int argc, char* argv[]) 

感謝。

+0

どのライブラリに 'main'がありますか? 'commandInterpreter_lib.a'か未使用の' nagc_mkl'、 'pardiso500-GNU481-X86-64'、' acml'ライブラリですか? (未使用、 '$(LIBS)'はリンク時に使用されないので、それは思われます) – Kusalananda

+0

commandInterpreter_libにはメインがあります。 LIBSは意図的に最小限の例が残っています。 – user3572032

+0

そして、あなたの問題には絶対に*関係がありません。あなたはC++コンパイラとリンクしています。他にも同じコンパイラでコンパイルされていましたか? – Kusalananda

答えて

1

私は何が間違っているか推測することができます。

コマンドラインの長さを短縮するために、スタティックライブラリをリンクするだけで、便利なオブジェクトファイルのバンドルよりも多くのことがあります。それに加えて、リンカは必要と思っているオブジェクトファイルのみをリンクします。リンカーが探している未定義シンボルがある場合、そのオブジェクトに含まれているオブジェクトファイルが必要です。リンカーがオブジェクトに必要とするシンボルがない場合、リンカーはオブジェクトを無視し、リンクしません。

プログラムを作成する通常の方法は、メインプログラムをコマンドラインでオブジェクトファイルとして表示することです。リンカは常にすべてのオブジェクトファイルをリンクします。これによりリンカは、(オブジェクトファイルによって)定義され、未定義(オブジェクトファイルが使用するものの、定義されていないもの)のセットをリンカに与えます。リンカーは、リンク行のライブラリを通過し、未定義シンボルを解決するオブジェクトファイルを追加します。これらのオブジェクトファイルには、リンカーが後で解決する必要がある他の未定義のシンボルがあるかもしれません。

私が推測できることは、リンク行にオブジェクトファイルを持たないことで、リンカーはオブジェクトを見ない必要に応じてメインを含むライブラリにファイルがあり、リンクされていません。

私は、デバッグとビルド以外のビルドが違いを生む理由はわかりません。

このようにしなければならない理由についてのあなたのコメントは分かりませんでした。このことを知っていた人でも、ソフトウェアを維持するためには誰かがそれについて学ぶ必要があります。

いずれにしても、いくつかの選択肢があります。

"ar"プログラムを使用してメインを含むオブジェクトファイルを抽出し、それを直接リンクするのは簡単なことです:ライブラリにオブジェクトを追加することに加えて、arはそれらを抽出することができます。次に、そのオブジェクトを直接リンクすることができます。 arのmanページを参照してください。

もう1つは、コンパイラとリンカーのドキュメントを見て、ライブラリ内の未解決のシンボルだけでなく、ライブラリ全体を強制的に含むフラグを見つけることです。たとえば、GCC/binutilsリンカーの場合、コマンドラインに完全に組み込みたいライブラリの前に-Wl,--whole-archiveを渡してから、その機能をオフにした後に-Wl,--no-whole-archiveを渡すことができます。

+0

こんにちはMadScientist。あなたが書いたものを試してみる。現時点では、gcc 4.8を使用しています。インテル®コンパイラーはすべてのバージョンで動作しますが、上記の4.9およびすべてのバージョンでは動作しません。 はい、今後さらに開発される予定のある人は、将来このコードを参照する必要がありますが、これをコードと組み合わせるためにはこのバージョンを正確に必要とします。私がブラックボックスとしてしか使用していないコードとmakefileを理解する;) – user3572032

関連する問題