Неразрешенные внешние символы в статической библиотеке C++C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Неразрешенные внешние символы в статической библиотеке C++

Сообщение Anonymous »

У меня есть два проекта; статическая библиотека и тесты.

Я уверен, что правильно настроил Visual Studio для «тестирования» проекта, использующего статическую библиотеку. Вот что я сделал:
  • Настроил проект библиотеки для сборки как статическую библиотеку .lib
  • Добавлено дополнительные каталоги включения в тестах (C/C++ -> Общие -> Дополнительные каталоги включения)
  • Добавлены дополнительные каталоги библиотек в тестах (Компоновщик -> Общие -> Дополнительные каталоги библиотек)
  • Добавил свою библиотеку в качестве зависимости (Компоновщик -> Ввод-> Дополнительные зависимости)
Я вижу, что моя Проект «tests» видит файл .lib и, похоже, «пытается» ссылаться на него. Я заметил, что когда я использую объекты (определенные в классах) в своем тестовом проекте, все в порядке. Проблема в том, что я пытаюсь использовать функции (а не функции-члены!).

Пример:

В моем заголовке (.h) файл:

Код: Выделить всё

/*includes omitted*/

namespace kx
{
void func();
/*...and more API functions*/
}
В моем исходном файле (.cpp)

Код: Выделить всё

#include "../MyHeader.h"

namespace kx
{
void func()
{
/*definition...*/
}

/*and more definitions...*/
}
Приведет к ошибке компоновщика; неразрешенный внешний символ "void __cdecl kx::func()"

Я где-то читал, что это вызвано смешиванием кода 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»