gpt4 book ai didi

c++ - 如何将 C++17 stdc++fs 库链接到混合语言(C++ 和 Fortran)CMake 项目?

转载 作者:行者123 更新时间:2023-12-01 22:17:11 35 4
gpt4 key购买 nike

我正在尝试使用 CMake 将一些 Fortran 代码添加到我的 C++ 项目中。该项目使用 C++17 文件系统库没有任何问题,直到我将此 Fortran 文件添加到可执行文件中,这似乎破坏了链接器。我已将问题简化为一个最小的示例,除了产生错误之外没有任何功能。

原始 CMakeLists.txt(编译良好):

cmake_minimum_required( VERSION 3.10.2 )

enable_language( Fortran )
project( Minimal C CXX Fortran )

# Using C++17.
set( CMAKE_CXX_STANDARD 17 )
set( CMAKE_CXX_STANDARD_REQUIRED ON )

add_executable( Executable test.cpp )
target_link_libraries( Executable stdc++fs )

修改了CMakeLists.txt(添加了test.f90,不再编译):

cmake_minimum_required( VERSION 3.10.2 )

enable_language( Fortran )
project( Minimal C CXX Fortran )

# Using C++17.
set( CMAKE_CXX_STANDARD 17 )
set( CMAKE_CXX_STANDARD_REQUIRED ON )

add_executable( Executable test.cpp test.f90 )
target_link_libraries( Executable stdc++fs )

后者编译/链接失败,并出现以下错误(如果前者省略了 target_link_libraries 行,则与该错误相同):

CMakeFiles/Minimal.dir/test.cpp.o: In function `std::filesystem::__cxx11::path::path<char [5], std::filesystem::__cxx11::path>(char const (&) [5], std::filesystem::__cxx11::path::format)':
test.cpp:(.text._ZNSt10filesystem7__cxx114pathC2IA5_cS1_EERKT_NS1_6formatE[_ZNSt10filesystem7__cxx114pathC5IA5_cS1_EERKT_NS1_6formatE]+0x6d): undefined reference to `std::filesystem::__cxx11::path::_M_split_cmpts()'
collect2: error: ld returned 1 exit status
CMakeFiles/Minimal.dir/build.make:120: recipe for target 'Minimal' failed
make[2]: *** [Minimal] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/Minimal.dir/all' failed
make[1]: *** [CMakeFiles/Minimal.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

为什么会发生这种情况以及如何解决它?我已尝试 set_property( TARGET Executable PROPERTY LINK_LANGUAGE Fortran ),但这不起作用。

add_library( TestLibrary test.f90 )
...
target_link_libraries( Executable TestLibrary )

也没有工作。非常感谢任何指导。

完整引用:

测试.cpp:

#include <filesystem>

int main()
{
std::filesystem::path test ("test");

return EXIT_SUCCESS;
}

测试.f90:

subroutine do_nothing()

end

命令行调用:

cmake -DCMAKE_CXX_COMPILER=g++-8 ..
make

我的 GCC 版本是 8.3.0。

最佳答案

这很可能是不同编译器版本混合的结果。您仅覆盖 C++ 编译器,但 C 和 Fortran 编译器也应与其保持一致。当我使用 GCC 8.2 中的 gccgfortran 时,我能够在链接过程中收到类似的错误消息,但使用 GCC 9.2 中的 g++ (使用 CMake 3.10.2)。

这是因为 CMake 从 C 编译器获取一些重要路径(例如查找运行时库的默认目录)。但是,如果您使用不同的 C++ 编译器编译 C++ 代码,它会使用后者的 header ,从而导致不兼容。

您应该始终使用一致的编译器集;在这种情况下:

cmake \
-D CMAKE_C_COMPILER=gcc-8 \
-D CMAKE_CXX_COMPILER=g++-8 \
-D CMAKE_Fortran_COMPILER=gfortran-8 \
..

关于c++ - 如何将 C++17 stdc++fs 库链接到混合语言(C++ 和 Fortran)CMake 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58678468/

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