2016-08-12 7 views
1

У меня есть проект в чистой библиотеке C-st usb, и мне нужно перенести его на C++ и сменить те же структуры на классы. Я удалил все C++ "виды защиты", как:C переход на C++ (встроенный)

#ifdef __cplusplus 
extern "C" { 
#endif 

#ifdef __cplusplus 
} 
#endif 

Я изменил все расширения файлов из .c в .cpp (кроме библиотеки HAL). Я понял, что C++ .hex меньше 7kB, а c .hex. Когда я просмотрел файл .map, я увидел, что многие функции отсутствуют. Я думал, что функции static вызвали это, но удаление static ключевого слова не помогло. Кто-нибудь знает, что может привести к тому, что некоторые функции не были скомпилированы. Когда расширения .c все в порядке.

+1

Только для записи: для компилятора и компоновщика расширение файла не имеет значения. –

+0

Несколько вещей, которые было бы интересно узнать: 7kB меньше по сравнению с общим размером? Вы просто потеряли определения функций или потеряли функциональность программного обеспечения? –

+1

30kB в C, 23kB в C++. Я потерял функциональность. Когда скомпилировано на c ПК распознает мое устройство, то при компиляции в C++ это не так. – legier

ответ

1

Функции C++ имеют разные сигнатуры, чем C-функции. Поскольку вы потеряли функциональность, а код намного меньше, вполне вероятно, что функция, которая требует связи C, компилируется как C++, а несоответствие подписи предотвращает правильную привязку.

Вероятное место для этого происходит в таблице векторов прерываний. Если функция обработчика скомпилирована с помощью ссылки C++, адрес обработчика не будет помещен в таблицу, которая скомпилирована с помощью C.

Двойная проверка векторов прерываний и убедитесь, что они ссылаются на правильные функции. Если они верны, проверьте любой другой код, скомпилированный с помощью C, который может ссылаться на внешний символ, скомпилированный с C++.

2

Я могу думать о двух основных причин:

  1. встраивание. Компилятор может решить, что нет необходимости выделять функцию как автономную функцию, если все обычаи могут быть встроены.
  2. Неиспользованный код. Компилятор может видеть, что функция не используется нигде в вашем коде и не решит ее устранить из окончательного результата.

Если результат будет использоваться как библиотека, то ваша среда вызовет определенные функции без явного вызова в вашем собственном коде, я думаю, что лучший способ - собрать и связать ваш код в виде библиотеки (возможно, динамический lib) и экспорт этих функций в качестве интерфейса библиотеки (видимость в gcc, dllexport в MSVC) заставит компилятор/компоновщик включить их в выпущенный двоичный файл, даже если они не видят, почему они нужны сейчас. (Конечно, это дикое предположение о вашей целевой среде.)

Другой вариант - отключить определенные оптимизации компилятора/компоновщика для удаления мертвого кода и принудительного испускания отдельного экземпляра функции для встроенных функций, но я думаю, что это очень косвенный подход, имеют более широкий эффект и могут осложнить обслуживание позже.