mingw64 pjsip sizeof (fd_set) всегда удваивает sizeof (pj_fd_set_t), вызывая утверждение в sock_select.c - PullRequest
0 голосов
/ 27 июня 2019

Я скомпилировал pjsip в свою программу, которую я пишу в среде msys2 / mingw (64-битная версия). Компилируется нормально. Однако, когда я запускаю его в своей программе, я получаю утверждение

// Line 49 of ../src/pj/sock_select.c
sizeof(pj_fd_set_t)-sizeof(pj_sock_t)>=sizeof(fd_set)

Каждый раз, когда я запускаю программу.

Когда я занимаюсь копанием, люди говорят об увеличении PJ_IOQUEUE_MAX_HANDLES. Итак, я сделал и положил printf в функцию перед утверждениями, чтобы увидеть, какие размеры:

// My PJ_FD_ZERO variant
PJ_DEF(void) PJ_FD_ZERO(pj_fd_set_t *fdsetp)
{
    printf( "PJ_IOQUEUE_MAX_HANDLES: %d, pj_fd_set_t: %I64d, pj_sock_t: %I64d, fd_set: %I64d\n", PJ_IOQUEUE_MAX_HANDLES, sizeof(pj_fd_set_t), sizeof(pj_sock_t), sizeof(fd_set) );
    PJ_CHECK_STACK();
    pj_assert(sizeof(pj_fd_set_t)-sizeof(pj_sock_t) >= sizeof(fd_set));

    FD_ZERO(PART_FDSET(fdsetp));
    PART_COUNT(fdsetp) = 0;
}

Программа выведет что-то вроде этого:

10:27:43.477        os_core_win32.c !pjlib 2.9 for win32 initialized
10:27:43.507         sip_endpoint.c  .Creating endpoint instance...
PJ_IOQUEUE_MAX_HANDLES: 16384, pj_fd_set_t: 65552, pj_sock_t: 4, fd_set: 131080

Однако, когда я настраиваю PJ_IOQUEUE_MAX_HANDLES, размер pj_fd_set_t увеличивается , как и должно , но! sizeof (fd_set) также становится немного меньше, чем DOUBLE, независимо от размера sizeof (pj_fd_set_t)! В руководстве по winsock сказано, что я не могу установить размер fd_set, поэтому я очень запутался, как устанавливается размер! Я не вижу нигде в коде pjsip, что это устанавливается.

Так что настройка PJ_IOQUEUE_MAX_HANDLES - это проигрышная битва.

Как я могу это исправить, чтобы мой код перестал утверждаться?

Некоторые ссылки

Сценарий Bash, который я запустил для настройки pjsip

#!/bin/bash

JOPT=1
DEBUG=false
BUILD_ALL=true
CLEAN_BEFORE_BUILD=false

TOUCH_COMMAND="touch configure.ac aclocal.m4 configure Makefile.am Makefile.in"

while getopts ":pdj:o:c" opt; do
        case $opt in
                j)
                        JOPT="$OPTARG"
                        ;;
                c)
                        echo "Clean before build is set."
                        CLEAN_BEFORE_BUILD=true;
                        ;;
                d)
                        DEBUG=true
                        ;;
                o)
                        IFS=', ' read -r -a BUILD_OPTS <<< "${OPTARG}"
                        BUILD_ALL=false

                        for option in "${BUILD_OPTS[@]}" ; do
                                # Set individual
                                case $option in
                                        pjsip)
                                                BUILD_PJSIP=true;
                                                ;;
                                        *)
                                                echo "Unknown build option ${option}"
                                                exit
                                esac
                        done
                        ;;
                \?)
                        echo "Invalid option: -${OPTARG}" >&2
                        exit 1
                        ;;
                :)
                        echo "Option -${OPTARG} requires an argument." >&2
                        exit 1
                        ;;
        esac
done

# Make the out
mkdir out
OUT_PREFIX="$( pwd )/out"
export PKG_CONFIG_PATH="${OUT_PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH}"

if [ "$DEBUG" = true ] ; then
MAKEFLAGS="-g -O0"
else
MAKEFLAGS="-O2"
fi

# Main directory
LIB_DIRECTORY="$(pwd)/lib"

# Descend
cd "${LIB_DIRECTORY}"

pwd

# pjsip
cd "${LIB_DIRECTORY}/pjsip"
if [ "${BUILD_ALL}" = true ] || [ "${BUILD_PJSIP}" = true ] ; then
        eval $TOUCH_COMMAND

        ./configure CFLAGS="${MAKEFLAGS} -I${OUT_PREFIX}/include" CXXFLAGS="${MAKEFLAGS}" LDFLAGS="-L${OUT_PREFIX}/lib" \
                --prefix="${OUT_PREFIX}" \
                --disable-openh264 \
                --disable-v4l2 \
                --disable-ffmpeg \
                --enable-libsamplerate \
                --disable-video \
                --enable-shared \
                --disable-static \
                --disable-libyuv \
                --with-external-speex \
                --with-gnutls \
                || exit

        if [ "${CLEAN_BEFORE_BUILD}" = true ] ; then
                make clean
        fi

        # Without this it breaks on msys2
        make -j $JOPT dep || exit
        # Make the actual
        make -j $JOPT || exit
        # Note, had issue with writing to //c/.../pkgconfig/libproject.pc
        make install || exit
fi

Снимок экрана assert

assert screenshot

- Редактировать -

Достаточно забавно, когда я запускаю эту программу, sizeof (fd_set) составляет 520.

#include <winsock.h>

#include <iostream>

int main( int argc, char *argv[] )
{
    std::cout <<
        "sizeof( fd_set )=" << sizeof( fd_set ) << "\n"
        "FD_SETSIZE=" << FD_SETSIZE << std::endl;

    return( EXIT_SUCCESS );
}

Результат:

sizeof( fd_set )=520
FD_SETSIZE=64

1 Ответ

0 голосов
/ 29 июня 2019

Я снова отвечаю на свой вопрос.

Я думаю, что происходит, что pjsip не обнаруживает, что я использую windows с mingw, несмотря на то, что это обнаруживается при конфигурировании.

checking build system type... x86_64-w64-mingw32
checking host system type... x86_64-w64-mingw32
checking target system type... x86_64-w64-mingw32

Я нашел этот маленький самородок в types.h

/** Socket handle. */
#if defined(PJ_WIN64) && PJ_WIN64!=0
    typedef pj_int64_t pj_sock_t;
#else
    typedef long pj_sock_t;
#endif

Я думаю, понял, что pj_fd_set_t (который состоит из pj_sock_t) всегда будет меньше, чем fd_set (который состоит из fd)если размеры выключены.Это объясняет пропорциональный феномен.Это также потому, что PJSIP определяет FD_SETSIZE в Windows при обнаружении.

Поэтому я просто запустил ./configure, как я делал выше, а затем изменил вручную:

  • build.mak
  • build / os-auto.mak

Замена PJ_AUTOCONF = 1 на PJ_WIN32 = 1.

Затем я вручную изменил Makefile, включив правильный файл.

include build/os-win32.mak

И затем я скомпилировал, используя make dep && make && make install

Наконец, когда я скомпилировал его в свою программу, он пожаловался на реализацию строковых функций Unicode, поэтому я посмотрел на файл, выдавший ошибку (pj/compat/string.h).Я нашел определенную строку #if (_MSC_VER) и добавил еще несколько определений, как показано ниже, для поддержки макросов MINGW.

#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)
#   define strcasecmp   _stricmp
#   define strncasecmp  _strnicmp
#   define snprintf     _snprintf
#   define vsnprintf    _vsnprintf
#   define snwprintf    _snwprintf
#   define wcsicmp      _wcsicmp
#   define wcsnicmp     _wcsnicmp
#else
#   define stricmp      strcasecmp
#   define strnicmp     strncasecmp

#   if defined(PJ_NATIVE_STRING_IS_UNICODE) && PJ_NATIVE_STRING_IS_UNICODE!=0
#       error "Implement Unicode string functions"
#   endif
#endif

Тогда это сработало!

...