我一生都在使用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?