Linux: (.text+0x20): undefined reference to `main'

CMake中に組み込まれている関係でソースからscipyをビルドしたいのに以下のようなエラーが出て止まってしまう。



gfortran -Wall -g build/temp.linux-x86_64-2.7/build/src.linux-x86_64-2.7/scipy/fftpack/_fftpackmodule.o build/temp.linux-x86_64-2.7/scipy/fftpack/src/zfft.o build/temp.linux-x86_64-2.7/scipy/fftpack/src/drfft.o build/temp.linux-x86_64-2.7/scipy/fftpack/src/zrfft.o build/temp.linux-x86_64-2.7/scipy/fftpack/src/zfftnd.o build/temp.linux-x86_64-2.7/build/src.linux-x86_64-2.7/scipy/fftpack/src/dct.o build/temp.linux-x86_64-2.7/build/src.linux-x86_64-2.7/scipy/fftpack/src/dst.o build/temp.linux-x86_64-2.7/build/src.linux-x86_64-2.7/build/src.linux-x86_64-2.7/scipy/fftpack/fortranobject.o -L/opt/intel/ext_tools/lib -Lbuild/temp.linux-x86_64-2.7 -ldfftpack -lfftpack -lpython2.7 -lgfortran -o build/lib.linux-x86_64-2.7/scipy/fftpack/_fftpack.so

/usr/lib/../lib64/crt1.o: In function `_start':

(.text+0x20): undefined reference to `main'

collect2: エラー: ld はステータス 1 で終了しました

error: Command "gfortran -Wall -g build/temp.linux-x86_64-2.7/build/src.linux-x86_64-2.7/scipy/fftpack/_fftpackmodule.o build/temp.linux-x86_64-2.7/scipy/fftpack/src/zfft.o build/temp.linux-x86_64-2.7/scipy/fftpack/src/drfft.o build/temp.linux-x86_64-2.7/scipy/fftpack/src/zrfft.o build/temp.linux-x86_64-2.7/scipy/fftpack/src/zfftnd.o build/temp.linux-x86_64-2.7/build/src.linux-x86_64-2.7/scipy/fftpack/src/dct.o build/temp.linux-x86_64-2.7/build/src.linux-x86_64-2.7/scipy/fftpack/src/dst.o build/temp.linux-x86_64-2.7/build/src.linux-x86_64-2.7/build/src.linux-x86_64-2.7/scipy/fftpack/fortranobject.o -L/opt/intel/ext_tools/lib -Lbuild/temp.linux-x86_64-2.7 -ldfftpack -lfftpack -lpython2.7 -lgfortran -o build/lib.linux-x86_64-2.7/scipy/fftpack/_fftpack.so" failed with exit status 1


これはmain関数を含むコードが存在しないからエラーが出ているのだが、単純に共有ライブラリ(.so)を作成したいだけなら -sharedオプションをつければ良いはず。
だがCMake(というかこれを含むターゲット全体)が複雑すぎてその操作が環境変数の設定だとどうにもうまくできなかった。

結局応急処置として別個で以下のプログラムを作成(shared.pyがmake時のエラーを検出し、実行しようとしたgfortran部分を読み取って"-shared"を追加して再実行(pathはbuildターゲットのscipyへのpath)。shared_bash.shでmake→shared.py→再度makeを繰り返す)

shared_bash.sh

while :

do


    make>&temp

    python shared.py

    if [ $? = 1 ]; then

break

    fi

  

done



shared.py


import os

import subprocess


path="hoge/scipy/"


with open("temp") as f:

    strs = f.read().split('\n')

    if "undefined reference to `main" in strs[-11]:

        a = strs[-13].split("gfortran")

        cmd = a[0]+"gfortran"+" -shared"+a[1]

        for aa in a[2:]:

            cmd=cmd+"gfortran"+aa

        os.chdir(path)

        print "---------------------------"

        print cmd

        print "---------------------------"

        print subprocess.call(cmd.split(" "))

        exit(0)

    else:

        print "No share library."

        exit(1)

コマンドラインから
bash shared_bash.sh
の力技でどうにか通った。
時間がなかったので苦肉の策だが、どうするのが正攻法なんだろう。

コメント

このブログの人気の投稿

旧バージョンのiMovieを入れる方法

TWRP公式サポートされてないAndroid端末でシステムインストールした話

[UTAU] Garagebandで作ったボーカルメロディーをUTAUに読ませる