0

Linuxでcmakeビルドシステムを動作させようとしています。プロジェクトには、多数の実行可能ファイルと2つのライブラリが含まれています。実行可能ファイルの1つが最初にライブラリとしてビルドされ、次にそのライブラリがmanサブルーチンを含むオブジェクトファイルにリンクされます。これが行われたのは、残りの実行可能ファイルがそのライブラリに依存しているためです。トリッキーな部分は、メインサブルーチンが残りのソースが依存するモジュール内で定義されているため、残りのソースの前にこれをコンパイルする必要があることです。その結果、メインサブルーチンが結果のライブラリに追加されます。これはMacOSXでは正常に機能しているようですが、Linuxではリンク状態が失敗します。

失敗した部分のcmakeファイルは次のようになります

cmake_minimum_required (VERSION 2.8)

# Create an empty variable to hold all the source files.
set (vmec_sources "")

# Add subdirectory for all the sources.
add_subdirectory (Sources)

add_library (vmec STATIC ${vmec_sources})
add_dependencies (vmec stell)

# Define an executable and link all libraries.
add_executable (xvmec ${CMAKE_CURRENT_SOURCE_DIR}/Sources/General/vmec_main.f)
add_dependencies (xvmec vmec)
target_link_libraries (xvmec vmec stell)

if ((NOT ${NETCDF_C} STREQUAL "") AND (NOT ${NETCDF_F} STREQUAL ""))
    target_link_libraries (xvmec ${NETCDF_C} ${NETCDF_F})
endif ()

cmakeを実行すると、すべてが正常に構成され、make MacOSXを実行するとすべてが正常に動作するmakeファイルが生成されます。Linuxでmakeを実行すると、失敗します。

OnLinuxからの出力make VERBOSE=1

Linking Fortran executable ../build/bin/xvmec
cd /home/user/reconstruction/VMEC2000 && /usr/bin/cmake -E cmake_link_script CMakeFiles/xvmec.dir/link.txt --verbose=1
/usr/bin/gfortran      -cpp -D NETCDF -I /usr/include CMakeFiles/xvmec.dir/Sources/General/vmec_main.f.o  -o ../build/bin/xvmec -rdynamic ../build/lib/libvmec.a ../build/lib/libstell.a /usr/lib/libnetcdf.so /usr/lib/libnetcdff.so 
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/libgfortranbegin.a(fmain.o): In function `main':
(.text+0x26): undefined reference to `MAIN__'
collect2: ld returned 1 exit status
make[2]: *** [build/bin/xvmec] Error 1
make[2]: Leaving directory `/home/user/reconstruction'
make[1]: *** [VMEC2000/CMakeFiles/xvmec.dir/all] Error 2
make[1]: Leaving directory `/home/user/reconstruction'
make: *** [all] Error 2

Mac OS Xでは、

Linking Fortran executable ../build/bin/xvmec
cd /Users/user/repo/trunk/VMEC2000 && "/Applications/CMake 2.8-8.app/Contents/bin/cmake" -E cmake_link_script CMakeFiles/xvmec.dir/link.txt --verbose=1
/usr/local/bin/gfortran     -framework Accelerate   -cpp -D DARWIN -D NETCDF -I /Users/user/NetCDF/include -O3 -ftree-vectorize -m64 -march=native -fomit-frame-pointer -falign-functions -mfpmath=sse CMakeFiles/xvmec.dir/Sources/General/vmec_main.f.o  -o ../build/bin/xvmec  ../build/lib/libvmec.a ../build/lib/libstell.a /Users/user/NetCDF/lib/libnetcdf.dylib /Users/user/NetCDF/lib/libnetcdff.dylib 
"/Applications/CMake 2.8-8.app/Contents/bin/cmake" -E cmake_progress_report /Users/user/repo/trunk/CMakeFiles  100
[100%] Built target xvmec

リンクラインは、すべて同じものを正しい順序でリンクしているように見えるので、Linuxでこれが失敗する理由がわかりません。

4

1 に答える 1

0

mainメソッドを含むものとして間違ったファイルがリストされていたことがわかりました。それ以降のバージョンのgfortranは、ライブラリ内から「MAIN__」をリンクできますが、gfortran-4.4はリンクできないようです。

于 2012-07-18T21:46:23.137 に答える