Сборка Apache APR 1.7 с Visual Studio (2017), IF_NAMESIZE не определено - PullRequest
0 голосов
/ 25 октября 2019

Попытка построить апрель 1.7 в Windows с Visual Studio, пробовал 2017 и 2013.

При сборке проекта (Debug | x86) или компиляции, например, dso.c, если появляется следующее сообщение об ошибке:

1>dso.c
1>c:\dev\log4cxx\apr\include\arch\win32\apr_arch_misc.h(503): error C2143: syntax error: missing ')' before '*'
1>c:\dev\log4cxx\apr\include\arch\win32\apr_arch_misc.h(503): error C2143: syntax error: missing '{' before '*'
1>c:\dev\log4cxx\apr\include\arch\win32\apr_arch_misc.h(503): error C2059: syntax error: ')'
1>c:\dev\log4cxx\apr\include\arch\win32\apr_arch_misc.h(503): error C2061: syntax error: identifier 'apr_winapi_pfn_if_indextoname'
1>c:\dev\log4cxx\apr\include\arch\win32\apr_arch_misc.h(503): error C2059: syntax error: ';'
1>c:\dev\log4cxx\apr\include\arch\win32\apr_arch_misc.h(503): error C2513: ' ': no variable declared before '='
1>c:\dev\log4cxx\apr\include\arch\win32\apr_arch_misc.h(503): error C2065: 'apr_winapi_pfn_if_indextoname': undeclared identifier
1>c:\dev\log4cxx\apr\include\arch\win32\apr_arch_misc.h(503): warning C4047: '=': 'int' differs in levels of indirection from 'int *(__cdecl *)(NET_IFINDEX,PCHAR)'
1>c:\dev\log4cxx\apr\include\arch\win32\apr_arch_misc.h(503): error C2146: syntax error: missing ';' before identifier 'apr_load_dll_func'
1>c:\dev\log4cxx\apr\include\arch\win32\apr_arch_misc.h(503): error C2100: illegal indirection
1>c:\dev\log4cxx\apr\include\arch\win32\apr_arch_misc.h(503): error C2064: term does not evaluate to a function taking 1207 arguments
1>c:\dev\log4cxx\apr\include\arch\win32\apr_arch_misc.h(503): warning C4033: 'apr_winapi_if_indextoname' must return a value

Я успешно собрал версию 1.65 (после применения подсказки от http://letcoderock.blogspot.com/2017/09/build-log4cxx-trunk-on-windows-by.html или Ошибка перекрестной компиляции Apache ./gen_test_char: невозможно выполнить двоичный файл )

Сравнивая apr_arch_misc.h двух версий, я заметил, что DLL_IPHLPAPI был новым для enum apr_dlltoken_e, и Intelisense жаловался на

APR_DECLARE_LATE_DLL_FUNC(DLL_IPHLPAPI, PCHAR, NETIOAPI_API_, if_indextoname, 0, (
    NET_IFINDEX InterfaceIndex,
    PCHAR       InterfaceName),
    (InterfaceIndex, InterfaceName));

с "ожиданием") ". Если изменились NETIOAPI_API_ на WINAPI. Не знаю, если это правильно, но теперь файл может быть скомпилирован (после выполнения вышеуказанного трюка с gen_test_char.exe).

Но после этого я столкнулся со следующей проблемой:

1>sockaddr.c
1>network_io\unix\sockaddr.c(144): error C2065: 'IF_NAMESIZE': undeclared identifier
1>network_io\unix\sockaddr.c(144): error C2057: expected constant expression
1>network_io\unix\sockaddr.c(144): error C2466: cannot allocate an array of constant size 0
1>network_io\unix\sockaddr.c(144): error C2133: 'scbuf': unknown size
1>network_io\unix\sockaddr.c(1274): error C2065: 'IF_NAMESIZE': undeclared identifier

Я успешно собрал apr с помощью gcc в linux / cygwin. Я рассмотрел замены препроцессора для IF_NAMESIZE, и здесь он заменяется на 44. Но не могу найти определение или где это установлено.

У кого-нибудь есть идеи как это исправить? И корректно ли указанное выше значение WINAPI?

1 Ответ

0 голосов
/ 30 октября 2019

Просто используйте cmake для построения решения Visual Studio:

С

cmake -G "Visual Studio 15 2017" -A x64

.sln правильно настроен, а построение решения работает безошибки. Даже gen_test_char.exe - это сборка.

Возможно, проект apr должен сделать инструкции по сборке cmake чуть более заметными на их сайте.

...