Как определить макрос переключения, который переключается между макросами атрибутов dllexport и dllimport с помощью CMak ⇐ C++
Как определить макрос переключения, который переключается между макросами атрибутов dllexport и dllimport с помощью CMak
Итак, у меня есть проект (который должен поддерживаться в MacOS, Linux и Windows), в котором я создаю общую библиотеку и набор исполняемых файлов, связанных с этой библиотекой. В моем корневом CMakeLists.txt я добавил:
set (CMAKE_CXX_VISIBILITY_PRESET скрыт) Так что все символы по умолчанию скрыты независимо от того, используется ли Windows (которая делает это по умолчанию) или Linux. Для этого мне потребуется вручную экспортировать символы общедоступного API. Чтобы облегчить это, я написал заголовок defines.hpp в каталоге utils/ моего проекта, который содержит следующее:
#ifndef __DEFINES_H_ #define __DEFINES_H_ #если определено(linux) || определено (__linux__) #define EXPORT __attribute__((visibility("default"))) #elif определено(_WIN64) || определено(__WIN32__) #если определено(COMPILE_LIB) #define ЭКСПОРТ __declspec(dllexport) #элиф #define ЭКСПОРТ __declspec(dllimport) #endif #endif #endif Идея заключалась в том, что я бы включил этот заголовок в любой заголовок, содержащий объявления, которые необходимо экспортировать (а затем импортировать) через:
#include "utils/defines.hpp" класс ЭКСПОРТ MyCoolClass(); ЭКСПОРТ void MyCoolFunction(); (Я еще не проверял это, поэтому, если возникнут какие-либо явные проблемы с тем, что я написал, пожалуйста, дайте мне знать!)
Мой вопрос в том, что мне не совсем понятно, как определить макрос COMPILE_LIB, учитывая, что библиотека и исполняемые файлы собираются/связываются с одной и той же настройкой CMake. Как я могу гарантировать, что библиотека собрана с использованием dllexport, а затем связана с исполняемыми файлами с помощью dllimport в той же сборке CMake? Или мне придется применить другой подход?
Принятый ответ в предыдущем посте SO, похоже, указывает на использование аргумента компилятора и сборку каждого из них отдельно, а это не совсем то, что я ищу. В отдельном ответе указано, что вам следует использовать projectname, определенный CMake, поскольку при компиляции DLL он будет определять макрос projectname_EXPORTS. Я также не уверен, что это снова будет работать с моей общей библиотекой, и все исполняемые файлы созданы в одном проекте CMake. (Соответствующие файлы CMakeLists.txt):
CMakeLists.txt для исполняемых файлов:
add_executable(быстрый рендеринг fast_render.cpp) target_link_libraries(быстрый рендеринг ${PROJECT_NAME}) УСТАНОВИТЬ (ЦЕЛЕВОЙ контейнер быстрого рендеринга НАЗНАЧЕНИЕ) ... CMakeLists.txt для библиотеки:
... add_library(${PROJECT_NAME} ОБЩИЙ ... ) target_link_libraries(${PROJECT_NAME} PUBLIC ... ) ... Будет ли этот подход работать здесь, или мои настройки CMake плохи для использования проекта несколькими способами, подобными этому?
Итак, у меня есть проект (который должен поддерживаться в MacOS, Linux и Windows), в котором я создаю общую библиотеку и набор исполняемых файлов, связанных с этой библиотекой. В моем корневом CMakeLists.txt я добавил:
set (CMAKE_CXX_VISIBILITY_PRESET скрыт) Так что все символы по умолчанию скрыты независимо от того, используется ли Windows (которая делает это по умолчанию) или Linux. Для этого мне потребуется вручную экспортировать символы общедоступного API. Чтобы облегчить это, я написал заголовок defines.hpp в каталоге utils/ моего проекта, который содержит следующее:
#ifndef __DEFINES_H_ #define __DEFINES_H_ #если определено(linux) || определено (__linux__) #define EXPORT __attribute__((visibility("default"))) #elif определено(_WIN64) || определено(__WIN32__) #если определено(COMPILE_LIB) #define ЭКСПОРТ __declspec(dllexport) #элиф #define ЭКСПОРТ __declspec(dllimport) #endif #endif #endif Идея заключалась в том, что я бы включил этот заголовок в любой заголовок, содержащий объявления, которые необходимо экспортировать (а затем импортировать) через:
#include "utils/defines.hpp" класс ЭКСПОРТ MyCoolClass(); ЭКСПОРТ void MyCoolFunction(); (Я еще не проверял это, поэтому, если возникнут какие-либо явные проблемы с тем, что я написал, пожалуйста, дайте мне знать!)
Мой вопрос в том, что мне не совсем понятно, как определить макрос COMPILE_LIB, учитывая, что библиотека и исполняемые файлы собираются/связываются с одной и той же настройкой CMake. Как я могу гарантировать, что библиотека собрана с использованием dllexport, а затем связана с исполняемыми файлами с помощью dllimport в той же сборке CMake? Или мне придется применить другой подход?
Принятый ответ в предыдущем посте SO, похоже, указывает на использование аргумента компилятора и сборку каждого из них отдельно, а это не совсем то, что я ищу. В отдельном ответе указано, что вам следует использовать projectname, определенный CMake, поскольку при компиляции DLL он будет определять макрос projectname_EXPORTS. Я также не уверен, что это снова будет работать с моей общей библиотекой, и все исполняемые файлы созданы в одном проекте CMake. (Соответствующие файлы CMakeLists.txt):
CMakeLists.txt для исполняемых файлов:
add_executable(быстрый рендеринг fast_render.cpp) target_link_libraries(быстрый рендеринг ${PROJECT_NAME}) УСТАНОВИТЬ (ЦЕЛЕВОЙ контейнер быстрого рендеринга НАЗНАЧЕНИЕ) ... CMakeLists.txt для библиотеки:
... add_library(${PROJECT_NAME} ОБЩИЙ ... ) target_link_libraries(${PROJECT_NAME} PUBLIC ... ) ... Будет ли этот подход работать здесь, или мои настройки CMake плохи для использования проекта несколькими способами, подобными этому?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение