簡體   English   中英

CMake:針對靜態C庫鏈接Fortran失敗

[英]CMake: Linking Fortran against static C library fails

在鏈接階段,使用CMake和GCC構建具有iso_c_binding的非常基本的Fortran項目失敗。 手動編譯和鏈接可以正常工作:

$ gcc6 -c getkey.c
$ gfortran6 -Wl,-rpath=/usr/local/lib/gcc6/ -o key key.f08 getkey.o

最小的CMakeLists.txt

cmake_minimum_required(VERSION 3.9)
project(GetKey)
set(VERSION 1.0)

set(CMAKE_Fortran_COMPILER "gfortran6")
set(GCC_LIB "-Wl,-rpath=/usr/local/lib/gcc6")
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${GCC_LIB}")
enable_language(Fortran)

add_library(getkey STATIC getkey.c)
add_executable(key key.f08)

set_target_properties(key PROPERTIES LINKER_LANGUAGE Fortran)
target_link_libraries(key getkey)

構建項目會導致以下鏈接器錯誤:

[...]
[100%] Linking Fortran executable key
/usr/lib/crt1.o: In function `_start':
/usr/src/lib/csu/amd64/crt1.c:(.text+0x17b): undefined reference to `main'
collect2: error: ld returned 1 exit status

鏈接器似乎在搜索main()函數,而Fortran沒有此功能。 嘗試強制使用Fortran鏈接器沒有區別:

set(CMAKE_Fortran_LINKER_PREFERENCE 100)
set(CMAKE_C_LINKER_PREFERENCE_PROPAGATES False)

感謝幫助。

范例程式碼

鏈接器錯誤不取決於實際的實現。 無論如何,一個基本的例子是:

key.f08

program main
    implicit none

    interface
        function get_key() bind(c, name='get_key')
            use iso_c_binding
            integer(kind=c_int) :: get_key
        end function get_key
    end interface

    write(*, '(i0)') get_key()
end program main

getkey.c

int get_key()
{
    return 10000;
}

詳細制作

運行make VERBOSE=1

/usr/local/bin/cmake -H"/home/user/fortran" -B"/home/user/fortran" --check-build-system CMakeFiles/Makefile.cmake 0
/usr/local/bin/cmake -E cmake_progress_start "/home/user/fortran/CMakeFiles" "/home/user/fortran/CMakeFiles/progress.marks"
make -f CMakeFiles/Makefile2 all
make -f CMakeFiles/key.dir/build.make CMakeFiles/key.dir/depend
cd "/home/user/fortran" && /usr/local/bin/cmake -E cmake_depends "Unix Makefiles" "/home/user/fortran" "/home/user/fortran" "/home/user/fortran" "/home/user/fortran" "/home/user/fortran/CMakeFiles/key.dir/DependInfo.cmake" --color=
make -f CMakeFiles/key.dir/build.make CMakeFiles/key.dir/build
[ 50%] Linking Fortran executable key
/usr/local/bin/cmake -E cmake_link_script CMakeFiles/key.dir/link.txt --verbose=1
/usr/local/bin/gfortran6    CMakeFiles/key.dir/getkey.c.o  -o key
/usr/lib/crt1.o: In function `_start':
/usr/src/lib/csu/amd64/crt1.c:(.text+0x17b): undefined reference to `main'
collect2: error: ld returned 1 exit status
*** Error code 1

Stop.
make[2]: stopped in /usr/home/user/fortran
*** Error code 1

Stop.
make[1]: stopped in /usr/home/user/fortran
*** Error code 1

Stop.
make: stopped in /usr/home/user/fortran

從詳細的make輸出中可以看到:

/usr/local/bin/gfortran6    CMakeFiles/key.dir/getkey.c.o  -o key

您根本不使用Fortran代碼進行構建! 這是因為CMake無法將.f08識別為代碼擴展名。 參見此處: cmake,fortran 2008和.f08文件擴展名

您可以簡單地將.f08文件重命名為.f (或.f90 ,如以下注釋中所述)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM