【发布时间】:2020-02-02 21:44:30
【问题描述】:
我有一个基于 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.cpp 和 app.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_();
}
【问题讨论】:
-
你有没有试过改变两个静态库的链接顺序,即将
LibWithMain移到FortLib前面? -
@vre 在您发表评论之前没有,但现在我有。它没有帮助。我将编辑问题以包含这一点。
标签: c++ cmake linker fortran intel