Я скомпилировал 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
- Редактировать -
Достаточно забавно, когда я запускаю эту программу, 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