【问题标题】:Make printf appear in stdout from shared object library使 printf 出现在共享对象库的标准输出中
【发布时间】:2018-01-02 16:41:15
【问题描述】:

我目前正在使用 PyCUDD,它是 SWIG 为 C 包 CUDD 生成的 Python 包装器。我目前正在尝试让 CUDD 从 C 代码中打印一些调试信息,但是 C 代码中的任何 printfs 似乎都没有产生任何输出 - 将它们放在 .i 文件中,以便 SWIG 产生输出,把它们在 C 代码中没有。我不确定这是 SWIG 的特定属性还是将 C 代码编译到共享对象库的属性。

(特别令人沮丧的是,我知道我曾经遇到过这个问题并让它工作过,但我现在似乎找不到任何搜索问题的东西,而且我显然忘记在这件事上留下笔记。)

【问题讨论】:

    标签: python c swig cudd


    【解决方案1】:

    我认为问题是启动程序关闭(或将原始标准输出处理程序/描述符重定向到某处)标准输出,因此库无法获取处理程序/描述符。所以我尝试恢复设备并重新打开。

    在 linux 中,控制台设备位于 /dev/stdout(它是指向特定设备或启动时位于 fd 1 中的文件的符号链接),因此请重新打开此文件并恢复文件描述符。

    int fd = open("/dev/stdout", O_RDONLY);
    if(fd != -1)
        dup2(fd,1);
    

    在 Windows 中,如果当前进程没有控制台,AllocConsole 会尝试创建新的控制台。这适用于 PyCUDD(或任何程序)使用自定义控制台的情况。并且 freopen 使我们分配的控制台可写,因此 printf 将适用于新控制台。

    AllocConsole();
    freopen("CONOUT$", "w", stdout);
    

    【讨论】:

    • 解释?当 stdout 是假文件句柄或未连接到控制台时,这似乎是一个修复,但我不确定为什么这会在没有任何解释的情况下解决 OP 的问题。 PyCUDD 或 SWIG 是否会导致此问题?
    • 我更新了答案以进行解释。谢谢你的建议。
    【解决方案2】:

    我仍然忘记了我之前的问题。但是,我发现导致我的问题的原因是链接器问题 - 链接器正在查看旧版本的库,它没有我的更改。

    【讨论】:

    • 请使用评论部分获得与问题相关的宝贵反馈,并使用答案部分为所提出的问题提供详细的解决方案。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2015-10-08
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多