我是Windows 10上的用户,使用Visual Studio 2015。假设我正在使用类似下面的CMakeLists构建库A:
我正在定义宏
什么是正确的做法?
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,并且在链接库A的外部应用程序中将WINDOWS_DLL_API
定义为dllimport
。问题是当我有另一个库B也链接到A时,我不知道如何将WINDOWS_DLL_API
覆盖回dllexport
。下面是我为库B编写的CMakeLists尝试: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
不需要这个定义,只需将其定义为INTERFACE。 - TsyvarevTestA.h
的应用程序(add_executable
),WINDOWS_DLL_API
将未被定义。 - user3667089_dllexport/__dllimport
一起工作,并且还处理使用-fvisibility=hidden
的GCC构建。 - Nazar554