【发布时间】:2021-08-03 20:15:49
【问题描述】:
我正在使用 cmake 进行编译。我在带有英特尔处理器的 Linux 上。重要的 cmake 行是
set(SRCS srcA.FOR srcB.FOR ... srcK.FOR)
add_executable(filename ${SRCS})
我没有收到任何错误,只有警告。共有三种类型的警告:
- 我没有使用变量(对我来说不好,但肯定不会破坏代码)
- “此名称未指定特定类型”
- “没有对文件 '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 文件中的什么会导致这种情况?你有什么想法吗?