在生成目标之前运行find_package

时间:2019-08-02 14:34:10

标签: cmake

我一生都在使用Visual Studio,但我只是在热身于cmake,它是崭新的包装概念。我使用的是Visual Studio内置的CMake,但我认为问题并不特定于此。在理解概念的同时,我遇到了麻烦。

我有一个共享库A。也有一个依赖于A的EXE B。

CMakeLists.txt用于A

cmake_minimum_required(VERSION 3.12)

# Name the library
set(PROJECT_NAME libA)

# Define the project
project(${PROJECT_NAME} VERSION 3.2.9)

# Add a dynamic library
add_library(${PROJECT_NAME} SHARED src/libA.c)

# Target include directories
target_include_directories(${PROJECT_NAME}
    PUBLIC
        $<INSTALL_INTERFACE:include>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/inc>
)

# Set VERSION and PUBLIC_HEADER of the library
set_target_properties(${PROJECT_NAME} PROPERTIES 
    VERSION ${PROJECT_VERSION}
    SOVERSION 3
    PUBLIC_HEADER inc/libA.h
)

# Export the API for DLL
if ( WIN32 )
  if ( MSVC )
     add_definitions( "-{PROJECT_NAME}_API=__declspec(dllexport)" )
  endif ( MSVC )
endif ( WIN32 )

# Install the library and export target
install(TARGETS ${PROJECT_NAME}
    EXPORT ${PROJECT_NAME}-targets
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
    PUBLIC_HEADER DESTINATION include
)

# Create the package config file
include(CMakePackageConfigHelpers)
configure_package_config_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/config/${PROJECT_NAME}-config.cmake.in 
    ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
    INSTALL_DESTINATION package
)

# Export the target to a file so that other projects can import this project without installation
export(EXPORT ${PROJECT_NAME}-targets FILE ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-targets.cmake NAMESPACE omp::)

#Register package in user's package registry
export(PACKAGE ${PROJECT_NAME})

B的CMakeLists.txt

cmake_minimum_required(VERSION 3.12)

# Add executable
add_executable(app src/main.cpp)

# Find the libA package
find_package(libA REQUIRED)
target_link_libraries(app libA)

# Install the library and export target
install(TARGETS app
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
)

顶级CMakeLists.txt

cmake_minimum_required(VERSION 3.12)

add_subdirectory(libA)
add_subdirectory(app)

libA-config.cmake.in

@PACKAGE_INIT@

include("${CMAKE_CURRENT_LIST_DIR}/libA-targets.cmake")

当我对CMakeLists.txt进行任何更改时,Visual Studio都会在后台自动运行生成器以生成构建系统。我已经设置了libA,这样它将立即从构建树中输出它的目标,而不是在安装后完成。这将有助于我进行智能感知,因为exe项目可以找到libA导出的.h文件,而无需构建和安装libA。但是在生成项目时出现错误:

Severity    Code    Description Project File    Line    Suppression State
Error       CMake Error at libA-config.cmake:27 (include):
  include could not find load file:

    libA-targets.cmake

如果在exe的CMakeLists.txt运行之前生成libA的生成树,我不会遇到错误,因为发生这种情况时,已经生成了目标文件。这里似乎存在一些计时问题。仅在解析并完成libA的CMakeLists.txt之后,如何指示cmake为exe运行CMakeLists.txt?

0 个答案:

没有答案