Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Module 目标链接库在链接时错误地拉入模块库 我使用CMAD3.2.2..< /P>有两个C++项目_Module_Cmake - Fatal编程技术网

Module 目标链接库在链接时错误地拉入模块库 我使用CMAD3.2.2..< /P>有两个C++项目

Module 目标链接库在链接时错误地拉入模块库 我使用CMAD3.2.2..< /P>有两个C++项目,module,cmake,Module,Cmake,第一个是模块库(一个动态加载的插件)。它为CMake安装DLL、头文件和配置文件 cmake_minimum_required(VERSION 3.12 FATAL_ERROR) project(MyPlugin LANGUAGES CXX) set(CMAKE_DEBUG_POSTFIX "d") # MODULE libraries are dynamically loaded at runtime and never linked against add_library(MyPlugin

第一个是模块库(一个动态加载的插件)。它为CMake安装DLL、头文件和配置文件

cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
project(MyPlugin LANGUAGES CXX)
set(CMAKE_DEBUG_POSTFIX "d")

# MODULE libraries are dynamically loaded at runtime and never linked against
add_library(MyPlugin MODULE
    include/a.h
    src/a.cpp
    src/b.h
    src/b.cpp
)

target_include_directories(MyPlugin
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:include/MyPlugin>
    PRIVATE
        src
)

install(TARGETS MyPlugin EXPORT MyPluginConfig
    # MODULE libraries are installed as LIBRARY
    LIBRARY DESTINATION plugins COMPONENT Runtime
    RUNTIME DESTINATION bin COMPONENT Runtime
    PUBLIC_HEADER DESTINATION include/MyPlugin COMPONENT Development
)
install(FILES $<TARGET_PDB_FILE:MyPlugin> DESTINATION plugins OPTIONAL COMPONENT Runtime)
install(
    DIRECTORY include/
    DESTINATION include/MyPlugin
    FILES_MATCHING PATTERN "*.h"
)
install(EXPORT MyPluginConfig
    NAMESPACE MyPlugin::
    DESTINATION lib/cmake/MyPlugin
)
使用vs2015生成的解决方案,链接失败,因为插件DLL是在链接可执行文件的过程中提供的

有没有人可以解决这个问题,或者我应该提交一个bug


关于。

此问题的解决方案是将库一分为二:只提供头的接口库和不导出任何头的模块库

模块库
CMakeLists.txt
变为:

cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
project(MyPlugin LANGUAGES CXX)
set(CMAKE_DEBUG_POSTFIX "d")


# Move public headers to a dedicated INTERFACE library
add_library(MyPluginInterface INTERFACE)
add_custom_target(Includes SOURCES include/a.h)
target_include_directories(MyPluginInterfacecmake_minimum_required(VERSION 3.12 FATAL_ERROR)
project(MyPlugin LANGUAGES CXX)
set(CMAKE_DEBUG_POSTFIX "d")


# Move public headers to a dedicated INTERFACE library
add_library(MyPluginInterface INTERFACE)
add_custom_target(Includes SOURCES include/a.h)
target_include_directories(MyPluginInterface
    INTERFACE
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:include/MyPlugin>
)
install(TARGETS MyPluginInterface EXPORT MyPluginConfig
    PUBLIC_HEADER DESTINATION include/MyPlugin COMPONENT Development
)


# MODULE libraries are dynamically loaded at runtime and never linked against
add_library(MyPlugin MODULE
    src/a.cpp
    src/b.h
    src/b.cpp
)
target_link_libraries(MyPlugin MyPluginInterface)
install(TARGETS MyPlugin
    # MODULE libraries are installed as LIBRARY
    LIBRARY DESTINATION plugins COMPONENT Runtime
    RUNTIME DESTINATION bin COMPONENT Runtime
)
install(FILES $<TARGET_PDB_FILE:MyPlugin> DESTINATION plugins OPTIONAL COMPONENT Runtime)

install(
    DIRECTORY include/
    DESTINATION include/MyPlugin
    FILES_MATCHING PATTERN "*.h"
)
install(EXPORT MyPluginConfig
    NAMESPACE MyPlugin::
    DESTINATION lib/cmake/MyPlugin
)

    INTERFACE
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:include/MyPlugin>
)
install(TARGETS MyPluginInterface EXPORT MyPluginConfig
    PUBLIC_HEADER DESTINATION include/MyPlugin COMPONENT Development
)


# MODULE libraries are dynamically loaded at runtime and never linked against
add_library(MyPlugin MODULE
    src/a.cpp
    src/b.h
    src/b.cpp
)
target_link_libraries(MyPlugin MyPluginInterface)
install(TARGETS MyPlugin
    # MODULE libraries are installed as LIBRARY
    LIBRARY DESTINATION plugins COMPONENT Runtime
    RUNTIME DESTINATION bin COMPONENT Runtime
)
install(FILES $<TARGET_PDB_FILE:MyPlugin> DESTINATION plugins OPTIONAL COMPONENT Runtime)

install(
    DIRECTORY include/
    DESTINATION include/MyPlugin
    FILES_MATCHING PATTERN "*.h"
)
install(EXPORT MyPluginConfig
    NAMESPACE MyPlugin::
    DESTINATION lib/cmake/MyPlugin
)
cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
project(MyExe LANGUAGES CXX)
set(CMAKE_DEBUG_POSTFIX "d")

find_package(MyPlugin REQUIRED)

add_executable(MyExe src/main.cpp)
target_link_libraries(MyExe MyPlugin::MyPluginInterface)

参见CMake的bug追踪器上的第18400期:
cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
project(MyExe LANGUAGES CXX)
set(CMAKE_DEBUG_POSTFIX "d")

find_package(MyPlugin REQUIRED)

add_executable(MyExe src/main.cpp)
target_link_libraries(MyExe MyPlugin::MyPluginInterface)