Я на Windows 10, Visual Studio 2015. Предположим, я строю библиотека А с CMakeLists похожийКак переписать определение макроса в CMake
cmake_minimum_required(VERSION 3.7)
project(A)
set(DLLIMPORT "__declspec(dllimport)")
set(DLLEXPORT "__declspec(dllexport)")
set(PROJECT_SRCS
${PROJECT_SOURCE_DIR}/src/TestA.cpp)
set(PROJECT_INCS
${PROJECT_SOURCE_DIR}/include/TestA.h)
add_library(${PROJECT_NAME} SHARED ${PROJECT_SRCS} ${PROJECT_INCS})
target_compile_definitions(${PROJECT_NAME} INTERFACE
WINDOWS_DLL_API=${DLLIMPORT})
target_compile_definitions(${PROJECT_NAME} PRIVATE
WINDOWS_DLL_API=${DLLEXPORT})
target_include_directories(${PROJECT_NAME} PUBLIC
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/include>)
Я ограничивающей макрос WINDOWS_DLL_API
, как dllexport
, когда это здание библиотеки A , и определяя WINDOWS_DLL_API
как dllimport
для внешних приложений, которые связывают библиотеку A. Проблема заключается в том, что у меня есть другая библиотека B, которая также связывает A, я не знаю, как перезаписать WINDOWS_DLL_API
до dllexport
. Ниже моя попытка моих CMakeLists для библиотеки B,
cmake_minimum_required(VERSION 3.7)
project(B)
set(DLLEXPORT "__declspec(dllexport)")
set(PROJECT_SRCS
${PROJECT_SOURCE_DIR}/src/TestB.cpp)
set(PROJECT_INCS
${PROJECT_SOURCE_DIR}/include/TestB.h)
add_library(${PROJECT_NAME} SHARED ${PROJECT_SRCS} ${PROJECT_INCS})
target_include_directories(${PROJECT_NAME} PUBLIC
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/include>)
target_link_libraries(${PROJECT_NAME} A)
# does not work
target_compile_definitions(${PROJECT_NAME} PRIVATE
WINDOWS_DLL_API=${DLLEXPORT})
Что такое правильный способ сделать это?
'... определение WINDOWS_DLL_API в DllImport для внешних приложений, которые ссылающиеся библиотека A.' -' B' является "внешней" библиотекой, которая связывает с 'A', поэтому он получает это определение. Если это определение не требуется для 'B', просто не определяйте его для' A' как * INTERFACE *. – Tsyvarev
@ Tssyvarev Если я не определяю его, то если у меня есть приложение ('add_executable'), которое ссылается на A и включает' TestA.h', 'WINDOWS_DLL_API' будет неопределенным. – user3667089
Это может быть полезно [GenerateExportHeader] (https://cmake.org/cmake/help/v3.0/module/GenerateExportHeader.html). Он работает с '_dllexport/__ dllimport', а также обрабатывает сборки GCC с помощью' -fvisibility = hidden' – Nazar554