Сделайте так, чтобы printf появился в stdout из библиотеки общих объектов

В настоящее время я использую PyCUDD, который является SWIG-генерируемой оболочкой Python для C-пакета CUDD. В настоящее время я пытаюсь заставить CUDD напечатать некоторую отладочную информацию изнутри кода C, но кажется, что любые printfs внутри кода C не производят никакого вывода - помещение их в файлы.i для SWIG производит вывод, помещая их в коде С нет. Я не уверен, является ли это определенным свойством SWIG или компилировать код C в библиотеку общих объектов.

(Особенно расстраивает то, что я знаю, что у меня была эта проблема, и она работала раньше, но сейчас я не могу найти ничего, что ищет эту проблему, и я, очевидно, забыл оставить заметки об этом.)

2 ответа

Я до сих пор забываю, в чем заключалась моя проблема. Однако я обнаружил, что причиной моей проблемы здесь была проблема компоновщика - компоновщик просматривал старую версию библиотеки, в которой не было моих изменений.

Я думаю, проблема в том, что запущенная программа закрывает (или перенаправляет оригинальный обработчик / дескриптор стандартного вывода куда-то), поэтому библиотека не может получить обработчик / дескриптор. Поэтому я попытался восстановить устройства и снова открыть.

В 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);
Другие вопросы по тегам