首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >autotools、stdc++fs、误报

autotools、stdc++fs、误报
EN

Stack Overflow用户
提问于 2020-10-16 15:10:45
回答 1查看 133关注 0票数 0

我尝试有条件地使用std::filesystem,如果它可用的话。检查头文件是否有效,首先通过AM_CHECK_HEADERS,然后是AC_TRY_COMPILE (后者是由于Xcode/OSX的一些组合具有头文件,但在实际编译时触发静态断言)。如果所有这些检查都通过,则设置HAVE_FILESYSTEM。然而,代码还需要与gcc 7.5.0兼容,这需要链接到libstdc++fs。因此,我添加了额外的检查:

代码语言:javascript
复制
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 inside配置脚本可以吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-16 15:23:05

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

下面是它应该是什么样子:

代码语言:javascript
复制
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++),请确保在运行此测试之前进行设置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64384496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档