Здравствуйте. Столкнулся с несколько странным поведением компилятора: слил библиотеку minilzo, создал проект, добавил исходники, поставил игнорировать дефолтовые либы. Проект не собирается: unresolved external symbol _memset referenced in function _lzo1x_1_compress. Сначала подумал, что где-то дёргается memset и даже нашёл где: Код (Text): lzo_memset(wrkmem, 0, ((lzo_uint)1 << D_BITS) * sizeof(lzo_dict_t)); но при дальнейшем изучении кода обнаружил: Код (Text): #define lzo_hmemset lzo_memset ... LZOLIB_PUBLIC(lzo_hvoid_p, lzo_hmemset) (lzo_hvoid_p s, int c, lzo_hsize_t len) { #if (LZO_HAVE_MM_HUGE_PTR) || !(HAVE_MEMSET) lzo_hbyte_p p = (lzo_hbyte_p) s; if __lzo_likely(len > 0) { do { *p ++ = (unsigned char)c; } while __lzo_likely(-- len > 0); } return s; #else return memset(s, c, len); #endif } условие (LZO_HAVE_MM_HUGE_PTR) || !(HAVE_MEMCMP) выполняется. Пробовал коментить строчку // return memcmp(s1, s2, len); - не помогает. Но стоит изменить тело функции, например, закоментить строчку //*p ++ = (unsigned char)c; - как всё нормально компилируется. Неужто линкер сравнивает генерируемый код и при возможности заменяет куски кода вызовом стандартных функций?
Да, только не линкер - этим компилятор занимается. Ещё присваивание структур как минимум на memcpy заменяется обычно.
Под дебагом собирается. Сейчас свой проект попробовал собрать. В проекте есть такая вот строчка: Код (Text): for (n_rep += 4; n_rep; -- n_rep, ++ j) d[j] = c_rep; тоже из-за неё не собирается. Говорит error LNK2001: unresolved external symbol _memset. писец, не думал, что msvc умный на столько, что заменяет исходный код вызовом стандартных функций..
srm Я не знаю как там msvc, gcc заменяет на вызовы функций типа __builtin*, и при желании можно указать промеж аргументов компиляции -ffreestanding, чтобы gcc оптимизируя не забывал бы о том, что никаких stdlib и crti.o не будет. Поройся промеж опций msvc -- там должно быть что-нибудь в этом роде: с каким бы подозрением я не относился к ms, но я не верю, что они такую каку могли заложить.