【问题标题】:Executable file does not exist after compiling Fortran code编译 Fortran 代码后可执行文件不存在
【发布时间】:2021-08-03 20:15:49
【问题描述】:

我正在使用 cmake 进行编译。我在带有英特尔处理器的 Linux 上。重要的 cmake 行是

set(SRCS srcA.FOR srcB.FOR ... srcK.FOR)
add_executable(filename ${SRCS})

我没有收到任何错误,只有警告。共有三种类型的警告:

  1. 我没有使用变量(对我来说不好,但肯定不会破坏代码)
  2. “此名称未指定特定类型”
  3. “没有对文件 'path/to/file/filename.FOR.o' 执行任何操作”

就在它说的“不采取行动...”警告之前

Linking Fortran executable filename

最后一行说

Built target filename

最后一行对我来说特别暗示应该有一个可执行文件,但我找不到它。我尝试使用搜索它 find -type f -name "*.exe" 和 `find -type f -name "filename" 都没有返回任何东西。

我会注意到我是在 Linux 上编译这些类型的文件的新手,所以我确信我做错了一些小事情并且不知道它是什么

EDIT 添加了更详细的错误输出 请注意,每个文件都会出现一次“未执行任何操作...”错误并且是相同的(当然除了文件名之外)

ifort: warning #10145: no action performed for file 'CMakeFiles/dynamicmpm.dir/getversion.for.o'

EDIT #2在下面添加cmake文件的内容

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(MPM)

enable_language (Fortran)

get_filename_component (Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME)

MESSAGE("Fortran_COMPILER_NAME = ${Fortran_COMPILER_NAME}")


set(CMAKE_Fortran_FLAGS "-nologo -O2 -assume buffered_io -fpp -Dinternal_release -reentrancy threaded -free -warn all -real_size 64 -Qauto -fp:strict -fp:constant -libs:static -threads -Qmkl:sequential -c -Qm64") 


if (Fortran_COMPILER_NAME MATCHES "gfortran")
  # gfortran
  set(COMMON_FLAGS "-fmax-identifier-length=63 -ffree-form -ffree-line-length-none -fdefault-real-8")
  set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} ${COMMON_FLAGS}")
  set (CMAKE_Fortran_FLAGS_DEBUG   "${CMAKE_Fortran_FLAGS_DEBUG} ${COMMON_FLAGS}")
endif()

set(SRCS srcA.FOR srcB.FOR ... srcK.FOR) #theres a bazillion files so I made this dummy line for the post
add_executable(filename ${SRCS})

编辑 3

在进行以下建议的更改后,我现在收到以下错误:

[100%] Linking Fortran executable dynamicmpm
CMakeFiles/dynamicmpm.dir/Solver.FOR.o: In function `modsolver_mp_createprofiledss_':
Solver.FOR:(.text+0x1143): undefined reference to `dss_create_'
Solver.FOR:(.text+0x11a8): undefined reference to `dss_define_structure_'
Solver.FOR:(.text+0x1471): undefined reference to `dss_reorder_'
CMakeFiles/dynamicmpm.dir/Solver.FOR.o: In function `modsolver_mp_solveequations_':
Solver.FOR:(.text+0x35ec): undefined reference to `dss_factor_real_d__'
Solver.FOR:(.text+0x361d): undefined reference to `dss_solve_real_d_'
CMakeFiles/dynamicmpm.dir/Solver.FOR.o: In function `modsolver_mp_destroyequations_':
Solver.FOR:(.text+0x4495): undefined reference to `dss_delete_'
CMakeFiles/dynamicmpm.dir/Solver.FOR.o: In function `modsolver_mp_initialisereducedsolution_':
Solver.FOR:(.text+0x5a58): undefined reference to `dss_create_'
Solver.FOR:(.text+0x5abd): undefined reference to `dss_define_structure_'
Solver.FOR:(.text+0x606d): undefined reference to `dss_reorder_'

在 Solver.FOR 的顶部我有 use mkl_dss 并且 mkl_dss.f90 包含在 set(SRCS srcA.FOR srcB.for mkl_dss.f90 ... otherSources.FOR)

我是否错误地链接了文件?

【问题讨论】:

  • 在 Linux 上搜索 *.exe 有点意思:与 Windows 不同,在 Linux 上,可执行文件没有 .exe 扩展名。
  • “我没有使用变量(对我来说不好,但肯定不会破坏代码)” - 解决问题并再次构建项目。 “此名称尚未指定特定类型”、“未对文件 'path/to/file/filename.FOR.o' 执行任何操作” - 请复制粘贴 exact 输出到问题中邮政。您可以使用Ctrl+K{} 按钮将输出格式化为代码。通常,将确切的输出放入问题帖子中比描述该输出提供更多信息。
  • 我在上面添加了无操作错误消息,并且正在处理未使用的变量消息。我应该提到代码在 Windows 上编译得很好,但我也试图让它在 Linux 上构建。这让我相信问题在于我如何链接文件,而不是代码本身。没有早点提到这一点是我的错。
  • 奇怪的是你得到了 filename.for.o,大多数构建使用 filename.o。你做了很多cmake更改吗?我们可能需要查看更多您的 cmake 文件
  • @Cocofalco cmake 文件中的什么会导致这种情况?你有什么想法吗?

标签: linux cmake fortran


【解决方案1】:

no action performed for file 'path/to/file/filename.FOR.o' - 您将-c 传递给标志,因此编译器不知道如何处理目标文件。研究-c 标志的含义。删除-c 标志。

get_filename_component (Fortran_COMPILER_NAME - 改用CMAKE_Fortran_COMPILER_ID STREQUAL "GNU"

不要使用set(CMAKE_Fortran_FLAGS。首选target_compiler_optionstarget_link_optionstarget_link_librariesadd_compile_options

不要写长行。用换行符将它们拆分为列表。

set(COMMON_FLAGS - 如果它们很常见,为什么要将它们分别添加到 _RELEASE_DEBUG 中?只需add_compile_options他们。

【讨论】:

  • 我对这一切都是全新的,所以我不能说谢谢!这很有帮助,我会在有机会的时候进行这些更改。
  • 我编辑了问题以反映当前的错误,这似乎与我认为的链接库的方式有关,但我似乎无法确定它。任何帮助将不胜感激!
  • meta.stackoverflow.com/questions/266767/… 记得创建一个minimal reproducible example。还使用详细构建cmake --build <buididr> --verbose 进行编译并发布/检查编译器行。我怀疑libs:static - 无论如何,debug 手动方式 - 删除行,直到你留下最小的minimal reproducible example,然后用最少的你会知道出了什么问题......同样的方式你可以找到-c - 通过删除东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多