使printf出现在共享对象库的stdout中

时间:2018-01-02 16:41:16

标签: python c swig cudd

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

(特别令人沮丧的是,我知道我遇到了这个问题并且之前已经开始工作了,但我现在似乎无法找到解决问题的任何东西,而且我显然忘了留言。)

2 个答案:

答案 0 :(得分:0)

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

在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);

答案 1 :(得分:0)

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