自动工具,stdc ++ fs,误报

阿拉格纳

我试图有条件地使用std :: filesystem(如果可用)。首先通过AM_CHECK_HEADERS,然后通过AC_TRY_COMPILE(由于Xcode / OSX具有标题的某些组合,但会在实际编译时触发静态断言)来检查标题文件是否正常。如果所有这些检查都通过,则设置HAVE_FILESYSTEM。但是,代码还需要与gcc 7.5.0兼容,这需要针对libstdc ++ fs进行链接。因此,我添加了额外的检查:

AC_MSG_CHECKING([if std::filesystem requires linking stdc++fs])
AC_TRY_LINK([
#if HAVE_FILESYSTEM
#include <filesystem>
#endif
],
[
    std::filesystem::directory_iterator {};
],
    ac_cv_link_fs_stdlib=no,
    ac_cv_link_fs_stdlib=yes)
if test "x$ac_cv_fs_stdlib" = xyes -a "x$ac_cv_class_fs_path" = xyes; then
    AC_MSG_RESULT(yes)
    SYSLIBS="$SYSLIBS -lstdc++fs"
else
    AC_MSG_RESULT(no)
fi

但是它一直给我假阳性,即在GCC 7.5.0上给出的答案为“否”。但是,构建本身会出现以下错误:utils.cc:(.text+0x2c9b): undefined reference to std::filesystem::create_directory(std::filesystem::__cxx11::path const&, std::error_code&)显然,这对我来说似乎是链接器错误。如何解决此问题/configure.ac出了什么问题?编辑:也尝试了std::filesystem::pathstd::filesystem::access并根据下面的答案进行了尝试std::filesystem::create_directory到目前为止,这些都没有帮助。是否有可能实际看到编译器调用?set -x内部配置脚本呢?

G.睡觉

您的测试仅声明一个未被使用的变量。因此,测试程序不会从中调用任何函数std::filesystem,因此它将始终通过链接阶段。您还使用AC_TRY_LINK,这是一个过时的宏,请AC_LINK_IFELSE改用。最后,似乎您在AC_TRY_LINK语句中设置的变量与您检查的变量不同:ac_cv_link_fs_stdlib与不一致ac_cv_fs_stdlib

它应该是这样的:

AC_LINK_IFELSE(
    [AC_LANG_SOURCE([
        #if HAVE_FILESYSTEM
        #include <filesystem>
        #endif

        int main() {
            std::error_code ec;
            std::filesystem::create_directory("/dev/null", &ec);
        }
    ])],
    [ac_cv_fs_stdlib=no],
    [ac_cv_fs_stdlib=yes]
)

如果尚未运行,请确保在运行此测试之前使用AC_PROG_CXX和设置AC_LANG(C++)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章