我有一个基于CMake的项目,包含三个目标:
FortLib
。>>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.cpp
和app.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()的定义。 ...
我不知道cmake的工作原理,但我想您需要反过来做。 main可能是您的工具链中的特殊功能,并且不应存在于库中。