我在Windows 10時,Visual Studio 2015年。假設我建庫A和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.問題是,當我有另一個庫B中還鏈接一個外部應用程序定義WINDOWS_DLL_API
作爲dllimport
,我不知道如何改寫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'不需要此定義,則不要將'A'定義爲* INTERFACE *。 – Tsyvarev
@Tsyvarev如果我不把它定義,那麼如果我有鏈接到包括應用程序('add_executable')'TestA.h',''WINDOWS_DLL_API將是不確定的。 – user3667089
這可能是有用的[GenerateExportHeader](https://cmake.org/cmake/help/v3.0/module/GenerateExportHeader.html)。它與'_dllexport/__ dllimport',並且還處理GCC構建與'-fvisibility = hidden' – Nazar554