gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:27:42 24 4
gpt4 key购买 nike

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

  • 用 Fortran 编写的静态库 FortLib
  • 静态库LibWithMain,用 C++ 编写,包含 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 或英特尔 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 是如何工作的,但我猜你需要反过来做。 main 可能是工具链中的特殊函数,不应该存在于库中。

  1. 构建 fortran 库
  2. 构建不带 main 的 c lib (app.cpp)
  3. 使用 c lib 和 fortran lib 构建 main。

在构建 c lib 时,它可能不会提示缺少外部资源,因为它是一个库,并不是所有事情都需要解决。

此外,在 app.cpp 中,您需要记住的是,在 Fortran 中,被调用者会解压参数,但在 C 中,调用者会解压。

当被调用者取消堆栈时,您需要 __stdcall 作为声明的一部分。在较旧的 MS 编译器上,这曾经是 extern PASCAL。当调用者取消堆栈时,您可以选择添加 __cdecl。

关于c++ - 当 Fortran 库中的 C++ 可执行文件链接到 C++ 库中的 main 时,链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58238326/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com