antlas1 / cmake_dll_demo

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Приветствие

Вы оказались здесь, если получили ворнинг типа warning C4273: несовместимое связывание dll (inconsistent dll linkage) для cmake. В репозитории представлены следующие проекты:

  • dll_export_all - экспортируем все классы и методы
  • dll_generated_macro - используем автоматически генерируемый макрос
  • dll_custom_macro - используем свой макрос
  • dll_error_no_export - демонстрация такого же ворнинга, который привёл вас к этому репозиторию

Экспорт методов в DLL

Макрос HELLOLIB_API превращается в __declspec(dllexport) или __declspec(dllimport) в зависимости от того, определен макрос ..._EXPORTS или нет. Пометкой __declspec(dllimport) помечаются функции в коде программы, которые находятся во внешней динамической библиотеке. Компоновщик видит эту отметку и ищет эту функцию не в коде программы, а в библиотеках.
Пометкой __declspec(dllexport) помечаются функции в коде библиотеки, которые будут выставлены наружу для того чтобы другие программы могли их использовать. Если вы не пометите функцию в коде библиотеки этой меткой, то функция будет “невидима” извне.

Для CMake три варианта решения:

  1. Вы можете добавить макрос в настройки проекта в CMakeLists.txt. Делается это так: target_compile_definitions(hello_lib PUBLIC HELLOLIB_CUSTOM_EXPORTS). См. проект dll_custom_macro
  2. Так как это проект CMake, то CMake в настройках проекта библиотеки автоматически добавил макрос hello_lib_EXPORTS. Вы можете просто использовать в коде hello_lib_EXPORTS для определения HELLOLIB_API. См. проект dll_generated_macro
  3. Нужно убрать макросы ..._EXPORTS и HELLOLIB_API отовсюду, и просто написать в CMakeLists.txt строчку: set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON). См. проект dll_export_all Эта команда автоматически сделает все функции и методы в библиотеке экспортируемыми.

About


Languages

Language:C++ 55.0%Language:CMake 45.0%