gpt4 book ai didi

c++ - 如何在 cmake 中要求没有二进制文件的仅 header 库?

转载 作者:太空宇宙 更新时间:2023-11-04 12:42:46 27 4
gpt4 key购买 nike

我创建了一个仅包含 header 的库,它是使用 cmake 安装的

add_library(mylib INTERFACE)

和导出的目标。当我在另一个库 (mylib2) 的 cmake 文件中使用 find_package(mylib REQUIRED)target_link_library 时,这工作正常,其中包括 header .

但是,当我使用导出的目标和 target_link_library 链接 mylib2 时,生成的 VS 文件在链接库中包含 mylib.lib

当我在所有三个项目的生成文件中查找字符串 mylib.lib 时,只有 visual studio 文件包含它,PackageConfig 都没有>PackageTargets 文件包含文件名。

header 库在其 CMakeLists.txt 中使用导出的目标

add_library(mylib INTERFACE)
target_compile_definitions(mylib INTERFACE -D_USE_MATH_DEFINES)
target_link_libraries(mylib INTERFACE somelibraries)
target_include_directories(mylib INTERFACE
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)
configure_package_config_file(mylibConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/mylibConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX})
install(TARGETS mylib EXPORT mylib-targets)
install(EXPORT mylib-targets FILE mylibTargets.cmake DESTINATION ${CMAKE_INSTALL_PREFIX})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/mylibConfig.cmake DESTINATION ${CMAKE_INSTALL_PREFIX})
install(DIRECTORY ./ DESTINATION include FILES_MATCHING PATTERN "*.h")

第二个库只是使用

find_package(mylib REQUIRED)
add_library(mylib2 source.cpp)
target_link_libraries(mylib2 mylib)
# some stuff to export targets, similar to the first lib

最终项目使用

add_binary(myproject source.cpp)
set(LINK_LIBRARIES mylib2)
target_link_libraries(myproject ${LINK_LIBRARIES}) # mylib2.lib is added to the project.

add_binary(myproject2 source.cpp)
target_link_libraries(myproject mylib2) # only the include paths are added.

仅当从变量设置库时才会出现此问题。

cmake 在哪个过程中将库文件名添加到链接库?它不应该继承 INTERFACE 属性吗?

最佳答案

要包含一个库,您通常必须包含头文件并链接一些目标文件。

话虽如此,如果所述库仅包含 header ,则您只需执行 include_directories(<library-include-folder>)你准备好了。因为通常不应将您的库编译成 .lib 文件。

在您的情况下,您可能必须这样做:(假设 mylib 仅包含 header )

find_package(mylib REQUIRED)
# Provides MYLIB_INCLUDE_DIR to include
# The line above also provides a MYLIB_LIBRARIES, which for header-only libraries should be empty

include_directories(${MYLIB_INCLUDE_DIR})
add_executable(main main.cpp)
target_link_libraries(main ${MYLIB_LIBRARIES}) # This can be onmitted since there is nothing to link

关于c++ - 如何在 cmake 中要求没有二进制文件的仅 header 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53335165/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com