Я уверен, что правильно настроил Visual Studio для «тестирования» проекта, использующего статическую библиотеку. Вот что я сделал:
- Настроил проект библиотеки для сборки как статическую библиотеку .lib
- Добавлено дополнительные каталоги включения в тестах (C/C++ -> Общие -> Дополнительные каталоги включения)
- Добавлены дополнительные каталоги библиотек в тестах (Компоновщик -> Общие -> Дополнительные каталоги библиотек)
- Добавил свою библиотеку в качестве зависимости (Компоновщик -> Ввод-> Дополнительные зависимости)
Пример:
В моем заголовке (.h) файл:
Код: Выделить всё
/*includes omitted*/
namespace kx
{
void func();
/*...and more API functions*/
}
Код: Выделить всё
#include "../MyHeader.h"
namespace kx
{
void func()
{
/*definition...*/
}
/*and more definitions...*/
}
Я где-то читал, что это вызвано смешиванием кода C с кодом C++ и решением этой проблемы заключается в использовании extern "C" в объявлениях функций. Я попробовал это, и это решило мою проблему, но мне это кажется неясным, поскольку я использую только C++.
Кроме того, если я правильно понимаю механизм, когда я использую extern "C", мои пространства имен будут игнорироваться, а это именно то, чего я не хочу в этом дизайне.
Далее я подумал, что, возможно, __cdecl вызывает эту проблему, поэтому я изменил объявления своих функций на void __stdcall func(), но у меня была точно та же ошибка компоновщика неразрешенный внешний символ "void __cdecl kx::func()"
Я работаю программистом C++, и когда я спросил старших сотрудников о моей проблеме, они рассказали мне описанный выше дизайн должен работать без внешнего C, если только я не смешаю его с кодом C.
Я хотел бы знать если что-то не так с моей настройкой/подходом/дизайном. В конце концов, я могу жить с подходом extern C, но я был бы очень удивлен, если бы это было единственное решение.
Я использую Visual Studio 2017.< /п>
Подробнее здесь: https://stackoverflow.com/questions/469 ... ic-library
Мобильная версия