2012-07-17 129 views
0

我試圖獲得一個在linux上工作的cmake構建系統。該項目包含一堆可執行文件和兩個庫。其中一個可執行文件首先被構建爲一個庫,然後該庫與包含man子例程的目標文件相鏈接。這是因爲其他可執行文件依賴於該庫。棘手的部分是主子程序是在模塊內部定義的,其餘的源依賴於它,所以這需要在其餘源之前編譯。結果是主子例程被添加到結果庫中。這似乎在Mac OS X上正常工作,但Linux上的鏈接狀態失敗。cmake fortran在linux上對MAIN__的未定義引用

發生故障的部分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 Mac OS X中的一切工作正常make文件。當我在Linux上運行make時失敗。

make VERBOSE=1 Linux上的輸出產生

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上失敗。

回答

0

原來,我列出了包含主要方法的錯誤文件。看起來,gfortran的後期版本可以從庫內部鏈接'MAIN__',而gfortran-4.4則不能。

相關問題