Вы оказались здесь, если получили ворнинг типа warning C4273: несовместимое связывание dll (inconsistent dll linkage)
для cmake.
В репозитории представлены следующие проекты:
- dll_export_all - экспортируем все классы и методы
- dll_generated_macro - используем автоматически генерируемый макрос
- dll_custom_macro - используем свой макрос
- dll_error_no_export - демонстрация такого же ворнинга, который привёл вас к этому репозиторию
Макрос HELLOLIB_API
превращается в __declspec(dllexport)
или __declspec(dllimport)
в зависимости от того, определен макрос ..._EXPORTS
или нет.
Пометкой __declspec(dllimport)
помечаются функции в коде программы, которые находятся во внешней динамической библиотеке. Компоновщик видит эту отметку и ищет эту функцию не в коде программы, а в библиотеках.
Пометкой __declspec(dllexport)
помечаются функции в коде библиотеки, которые будут выставлены наружу для того чтобы другие программы могли их использовать. Если вы не пометите функцию в коде библиотеки этой меткой, то функция будет “невидима” извне.
Для CMake три варианта решения:
- Вы можете добавить макрос в настройки проекта в CMakeLists.txt. Делается это так:
target_compile_definitions(hello_lib PUBLIC HELLOLIB_CUSTOM_EXPORTS)
. См. проект dll_custom_macro - Так как это проект CMake, то CMake в настройках проекта библиотеки автоматически добавил макрос hello_lib_EXPORTS. Вы можете просто использовать в коде hello_lib_EXPORTS для определения HELLOLIB_API. См. проект dll_generated_macro
- Нужно убрать макросы
..._EXPORTS
и HELLOLIB_API отовсюду, и просто написать в CMakeLists.txt строчку:set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
. См. проект dll_export_all Эта команда автоматически сделает все функции и методы в библиотеке экспортируемыми.