Не подскажите-ли, есть такой код, "gcc" его проглатывает молча и без ошибок, а VC2013 выдает "unresolved external symbol", опцией линкера /FORCE можно заставить его скомпилировать .exe, но при компиляции всё равно выдает error.
Вопрос — какими флагами оптимизации или ещё чего можно подавить эти "unresolved"?
Дело в том что опенсёрсный проект содержит сотни таких мест, править всё вручную — это кошмар, если подавить /FORCE то можно пропустить реальное "unresolved".
int main(int argc, char* argv[])
{
int n_ = GetN();
printf("out - %d", n_);
return 0;
}
int GetN(){
if (NULL) // мы не должны сюда попасть
{
return Bad();// этой функции нет
}
else
return Good();
}
int Good(){
return 5;
}
PS Сорри за "анонима", но что-то здесь с регистрацией проблемы.
Здравствуйте, Аноним, Вы писали:
А>Вопрос — какими флагами оптимизации или ещё чего можно подавить эти "unresolved"?
Удалось самому подобрать флаги в VC2013, оптимизация: "Maximize Speed (/O2)" "Whole Program Optimization No".
С такими флагами cl.exe игнорирует "unreachable code"
Здравствуйте, alik_wn, Вы писали:
А>>Вопрос — какими флагами оптимизации или ещё чего можно подавить эти "unresolved"?
_>Удалось самому подобрать флаги в VC2013, оптимизация: "Maximize Speed (/O2)" "Whole Program Optimization No". _>С такими флагами cl.exe игнорирует "unreachable code"
У вас потом баги повылезают в самых непредсказуемых местах. Особенно с gcc, который без ключей такой код проглатывает на ура, а реально компилирует вызовы для сигнатуры по умолчанию (хотя в разных версиях может быть по разному).
Добавьте объявление функций перед использованием, а если проект не ваш, то разберитесь с заголовочными файлами. Это реальная ошибка либо в коде либо в сборке и править надо её либо в коде либо в настройках линковщика, но никак не компилятора.
Здравствуйте, 11molniev, Вы писали:
1>У вас потом баги повылезают в самых непредсказуемых местах. Особенно с gcc, который без ключей такой код проглатывает на ура, а реально компилирует вызовы для сигнатуры по умолчанию (хотя в разных версиях может быть по разному).
1>Добавьте объявление функций перед использованием, а если проект не ваш, то разберитесь с заголовочными файлами. Это реальная ошибка либо в коде либо в сборке и править надо её либо в коде либо в настройках линковщика, но никак не компилятора.
Не думаю что баги повылазят, проект не мой, опенсёрсный, компилируется\собирается в оригинале с помощью make, конфигурируется и под gcc и VC2013, просто я его перетащил в студию, чтобы можно было по человечески изучить и дебажить, но с настройками студии по умолчанию он не захотел собираться, когда изучил makefile, оказалось что там для компилятора лишь одна значимая опция -O2(помимо всяких define\include), для линкера вообще только -nologo. Когда убрал в студии Whole Program Optimization всё собралось.
Здравствуйте, alik_wn, Вы писали:
1>>У вас потом баги повылезают в самых непредсказуемых местах. Особенно с gcc, который без ключей такой код проглатывает на ура, а реально компилирует вызовы для сигнатуры по умолчанию (хотя в разных версиях может быть по разному).
1>>Добавьте объявление функций перед использованием, а если проект не ваш, то разберитесь с заголовочными файлами. Это реальная ошибка либо в коде либо в сборке и править надо её либо в коде либо в настройках линковщика, но никак не компилятора.
_>Не думаю что баги повылазят, проект не мой, опенсёрсный, компилируется\собирается в оригинале с помощью make, конфигурируется и под gcc и VC2013, просто я его перетащил в студию, чтобы можно было по человечески изучить и дебажить, но с настройками студии по умолчанию он не захотел собираться, когда изучил makefile, оказалось что там для компилятора лишь одна значимая опция -O2(помимо всяких define\include), для линкера вообще только -nologo. Когда убрал в студии Whole Program Optimization всё собралось.
Тогда не действительно не вылезут
Рискну предположить, что вы просто не перенесли "всяких define\include" в проект студии от того это и поимели.
Здравствуйте, 11molniev, Вы писали:
1>Тогда не действительно не вылезут 1>Рискну предположить, что вы просто не перенесли "всяких define\include" в проект студии от того это и поимели.
Обижаете , это всё я в первую очередь перенёс (из makefile), там в коде есть зависимые от cpu, компилятора, функции, которые отключаются этими define, но сделано немного по идиотски
Сделано так:
funct = default_funct();
if (HAVE_ARM) {
funct = arm_funct();
}
Вместо того чтобы так:
funct = default_funct();
#if HAVE
funct = arm_funct();
#endif
Поэтому VC2013 и ругается на "unresolved external .. arm_funct"