当Fortran库中的C ++可执行文件链接到C ++库中的main时,链接器错误

问题描述 投票:3回答:1

我有一个基于CMake的项目,包含三个目标:

  • 用Fortran编写的静态库FortLib。>>
  • 使用C ++编写的静态库LibWithMain,其中包含int main()的定义。
  • 在上述两个库中都链接的可执行文件App。>>
  • 这是CMakeList的内容:

cmake_minimum_required(VERSION 3.7.2)
project(Mcve LANGUAGES C CXX Fortran)

add_library(FortLib STATIC fort.f90)
target_compile_options(FortLib PRIVATE /names:lowercase /assume:underscore /iface:cref)

add_library(LibWithMain STATIC main.cpp)

add_executable(App app.cpp)
target_link_libraries(App PRIVATE FortLib LibWithMain)

((有关可用于重现问题的源文件的内容,请参见底部)

我的问题是,链接App导致以下链接器错误:

libifcoremdd.lib(for_main.obj) : error LNK2019: unresolved external symbol MAIN__ referenced in function main

请注意,此引用来自libifcoremdd.lib,这是一个Intel Fortran库,显然已隐式链接到其中。

如果直接在main中定义功能App,则不会发生。这可以通过交换上面CMakeList中的文件main.cppapp.cpp来显示(以便在应用程序内部定义main)。然后,一切都会成功建立并链接。事实上,main的定义来自LibWithMain,从而使链接程序感到困惑。

在我的真实代码中,LibWithMain是Boost.Test,因此从它移出main并不是我的选择。

我的工具链是Visual Studio 2017和Intel Fortran 18,我的平台是Win64(在Visual Studio术语中为“ x64”)。此时无需支持其他编译器/平台。

我是C ++开发人员,几乎不了解Fotran或Intel Fortran生态系统,因此我不知道是什么原因或如何解决的。因此,这就是我的问题:

是什么引起链接器错误,如何解决?


上面的CMakeList中使用的这些简单文件足以重现此问题:

fort.f90

integer function fortfunc
  implicit none
  fortfunc = 42
end function

main.cpp

#include <iostream>

int work();

int main()
{
  std::cout << work() << std::endl;
  return 0;
}

app.cpp

extern "C" int fortfunc_();

int work()
{
  return fortfunc_();
}

我有一个基于CMake的项目,包括三个目标:用Fortran编写的静态库FortLib。静态库LibWithMain,用C ++编写,包含int main()的定义。 ...

c++ cmake linker fortran intel
1个回答
0
投票

我不知道cmake的工作原理,但我想您需要反过来做。 main可能是您的工具链中的特殊功能,并且不应存在于库中。

  1. 构建fortran库
© www.soinside.com 2019 - 2024. All rights reserved.