ошибка LNK2019 необъяснимая при попытке портировать openldap на windows

Я работаю над Windows XP с Visual Studio 2005. Мой проект — это проект Cmake, созданный после создания API-интерфейса абстракции LDAP в Linux. Я пытаюсь как-то заставить его работать в Windows.

У меня необычная ошибка связывания типа LNK2019

main.obj: ошибка LNK2019: внешний символ без разрешения _strcpy ссылка на функцию _menu

бывает, что эта функция находится в моем main.c, а указанная выше ошибка связывания исходит из моего другого файла LDAP.C, который содержит функцию load_values_from_attr()

/****/

static INT16 load_values_from_attr(t_LdapSearchContext ctx,
    UINT32 result_max_count, LDAP *ld, LDAPMessage *result_message,
    BerElement *ptr)
{
    UINT16 j=0;
    UINT16 i=0;

    char *str_attr; 
    struct berval **str_values;
    str_attr=ldap_first_attribute(ld, result_message, &ptr);

    if (str_attr == NULL) return 1;
    str_values=ldap_get_values_len(ld, result_message, str_attr);
    strcpy(ctx.attributs[i].attrs, str_attr);
    while(str_values[j]!=NULL && j+1<RESULT_WIDTH)
    {
        strncpy(ctx.attributs[i].values[j+1].val,
            str_values[j]->bv_val,MAX_LENGTH);
#ifdef WIN32
        ber_bvfree(str_values[j]); // <<< here is my problem
#endif
        j++;
    }

/****/

Когда я удаляю или комментирую строку с: ber_bvfree(str_values[j]);, происходит ошибка связывания, и когда я оставляю ее там, программа компилируется и может выполняться, но segfault на ней (это уже другая история).

Я не могу понять, почему компоновщик ведет себя таким образом.


person LELEVATOR    schedule 03.08.2010    source источник
comment
Мой французский заржавел и никогда не был так хорош для начала, но разве компоновщик не жалуется на ссылку на strcpy в функции menu? Почему вы считаете, что ошибка компоновщика связана с функцией, которую вы выбрали? Я обращаю внимание на звонок strcpy. О, и что произойдет, если вы замените strcpy на strncpy, который вы уже используете.   -  person torak    schedule 03.08.2010
comment
я думаю, что компоновщик жалуется на ссылку на _strcpy, которая, я думаю, является версией strcpy, преобразованной в объект main.o, созданный на предыдущем шаге прекомпилятором, и да, вы правы, похоже, что он не может найти правильное определение из него (у меня правильный заголовок). Я не могу прямо сейчас пытаться изменить strcpy в strncpy, но я буду делать это всякий раз, когда смогу. однако, если я оставлю ber_bvfree(str_values[j]); я не получаю ошибок компоновщика, и всякий раз, когда я пытаюсь прокомментировать эту строку или удалить ее, ошибки компоновщика являются их ошибками. Это может быть что-то еще, но я действительно понятия не имею   -  person LELEVATOR    schedule 04.08.2010
comment
хорошо, я все еще исследую, почему компоновщик действует таким образом, и заменяет все мои strcpy на memcpy в сочетании с strlen , и все равно это дает мне 1 > main.obj : error LNK2019: symbole externe non résolu _strlen référencé dans la fonction _menu ... ( неразрешенная ссылка на _strlen ). Обратите внимание, что эта ошибка связывания является лишь первой среди 73 ошибок связывания, следующих за   -  person LELEVATOR    schedule 04.08.2010
comment
ОБНОВЛЕНИЕ: ber_bvfree (str_values ​​[j]); определяется в lber.h, НО, как вы, возможно, уже знаете: если он удален из файла, я получил ошибку компоновщика, я заметил, что я должен использовать по крайней мере функцию из lber.h, чтобы компоновщик разрешил мне скомпилировать (даже если функция не имеет значения). я приближаюсь к истине, но все еще не понимаю, почему компоновщик ведет себя так странно   -  person LELEVATOR    schedule 04.08.2010


Ответы (1)


Окончательно !! после работы над опцией компоновщика в Visual Studio я понял, что там была опция /NODEFAULTLIB:msvcrtd.lib enable, которая испортила компоновщик. без него компоновщик может правильно связать разные объекты. (эта опция была включена после обнаружения проблемы компоновщика lnk2001 в моем коде)

NB: я до сих пор не могу сказать, почему эта опция связана с проблемами при связывании моего собственного объекта, обычно /NODEFAULTLIB:msvcrtd.lib используется для отключения включения библиотеки по умолчанию msvcrtd.lib.

я надеюсь, что это поможет кому-то

person LELEVATOR    schedule 04.08.2010