unresolved external symbol
От: Аноним  
Дата: 15.05.14 17:35
Оценка:
Не подскажите-ли, есть такой код, "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 Сорри за "анонима", но что-то здесь с регистрацией проблемы.
Re: unresolved external symbol
От: alik_wn  
Дата: 16.05.14 07:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вопрос — какими флагами оптимизации или ещё чего можно подавить эти "unresolved"?


Удалось самому подобрать флаги в VC2013, оптимизация: "Maximize Speed (/O2)" "Whole Program Optimization No".
С такими флагами cl.exe игнорирует "unreachable code"
Re[2]: unresolved external symbol
От: 11molniev  
Дата: 16.05.14 09:18
Оценка:
Здравствуйте, alik_wn, Вы писали:

А>>Вопрос — какими флагами оптимизации или ещё чего можно подавить эти "unresolved"?


_>Удалось самому подобрать флаги в VC2013, оптимизация: "Maximize Speed (/O2)" "Whole Program Optimization No".

_>С такими флагами cl.exe игнорирует "unreachable code"

У вас потом баги повылезают в самых непредсказуемых местах. Особенно с gcc, который без ключей такой код проглатывает на ура, а реально компилирует вызовы для сигнатуры по умолчанию (хотя в разных версиях может быть по разному).

Добавьте объявление функций перед использованием, а если проект не ваш, то разберитесь с заголовочными файлами. Это реальная ошибка либо в коде либо в сборке и править надо её либо в коде либо в настройках линковщика, но никак не компилятора.
Re[3]: unresolved external symbol
От: alik_wn  
Дата: 16.05.14 10:05
Оценка:
Здравствуйте, 11molniev, Вы писали:

1>У вас потом баги повылезают в самых непредсказуемых местах. Особенно с gcc, который без ключей такой код проглатывает на ура, а реально компилирует вызовы для сигнатуры по умолчанию (хотя в разных версиях может быть по разному).


1>Добавьте объявление функций перед использованием, а если проект не ваш, то разберитесь с заголовочными файлами. Это реальная ошибка либо в коде либо в сборке и править надо её либо в коде либо в настройках линковщика, но никак не компилятора.


Не думаю что баги повылазят, проект не мой, опенсёрсный, компилируется\собирается в оригинале с помощью make, конфигурируется и под gcc и VC2013, просто я его перетащил в студию, чтобы можно было по человечески изучить и дебажить, но с настройками студии по умолчанию он не захотел собираться, когда изучил makefile, оказалось что там для компилятора лишь одна значимая опция -O2(помимо всяких define\include), для линкера вообще только -nologo. Когда убрал в студии Whole Program Optimization всё собралось.
Re[4]: unresolved external symbol
От: 11molniev  
Дата: 16.05.14 16:02
Оценка:
Здравствуйте, alik_wn, Вы писали:

1>>У вас потом баги повылезают в самых непредсказуемых местах. Особенно с gcc, который без ключей такой код проглатывает на ура, а реально компилирует вызовы для сигнатуры по умолчанию (хотя в разных версиях может быть по разному).


1>>Добавьте объявление функций перед использованием, а если проект не ваш, то разберитесь с заголовочными файлами. Это реальная ошибка либо в коде либо в сборке и править надо её либо в коде либо в настройках линковщика, но никак не компилятора.


_>Не думаю что баги повылазят, проект не мой, опенсёрсный, компилируется\собирается в оригинале с помощью make, конфигурируется и под gcc и VC2013, просто я его перетащил в студию, чтобы можно было по человечески изучить и дебажить, но с настройками студии по умолчанию он не захотел собираться, когда изучил makefile, оказалось что там для компилятора лишь одна значимая опция -O2(помимо всяких define\include), для линкера вообще только -nologo. Когда убрал в студии Whole Program Optimization всё собралось.


Тогда не действительно не вылезут
Рискну предположить, что вы просто не перенесли "всяких define\include" в проект студии от того это и поимели.
Re[5]: unresolved external symbol
От: alik_wn  
Дата: 16.05.14 16:27
Оценка:
Здравствуйте, 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"
Re[6]: unresolved external symbol
От: alik_wn  
Дата: 16.05.14 16:30
Оценка:
Здравствуйте, alik_wn, Вы писали:

Т.е. скобочки надо убрать — это указатели на функции, ну вы поняли...
_>Сделано так:
_>
_>    funct = default_funct();

_>    if (HAVE_ARM) {
_>        funct = arm_funct();
_>    }
_>


_>Вместо того чтобы так:


_>
_>    funct = default_funct();
_>#if HAVE
_>    funct = arm_funct();
_>#endif
_>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.