在GitHub操作下运行时,将多个cmake库目标合并为单个目标失败
我正在尝试使用现代cmake构建系统建立持续集成工作流GitHub。在这个构建系统中,我需要找到两个外部库,一个C和Fortran版本。因为这些库不是内置的FindLIBRARY,所以我必须创建自己的库。我还想设置它,以便两个库可以作为单个目标链接在GitHub操作下运行时,将多个cmake库目标合并为单个目标失败,github,cmake,Github,Cmake,我正在尝试使用现代cmake构建系统建立持续集成工作流GitHub。在这个构建系统中,我需要找到两个外部库,一个C和Fortran版本。因为这些库不是内置的FindLIBRARY,所以我必须创建自己的库。我还想设置它,以便两个库可以作为单个目标链接 find_path (LIBRARY_INCLUDE_DIR NAMES library.h) mark_as_advanced (LIBRARY_INCLUDE_DIR) find_library(LIBRARY_C_LIB
find_path (LIBRARY_INCLUDE_DIR
NAMES library.h)
mark_as_advanced (LIBRARY_INCLUDE_DIR)
find_library(LIBRARY_C_LIBRARY
NAMES c_version)
mark_as_advanced (LIBRARY_C_LIBRARY)
find_library(LIBRARY_Fortran_LIBRARY
NAMES fortran_version)
mark_as_advanced (LIBRARY_Fortran_LIBRARY)
include (FindPackageHandleStandardArgs)
find_package_handle_standard_args (LIBRARY
REQUIRED_VARS LIBRARY_C_LIBRARY LIBRARY_Fortran_LIBRARY LIBRARY_INCLUDE_DIR
if (LIBRARY_FOUND)
set (LIBRARY_INCLUDE_DIRS ${LIBRARY_INCLUDE_DIR})
set (LIBRARY_LIBRARIES "${LIBRARY_C_LIBRARY} ${LIBRARY_Fortran_LIBRARY}")
if (NOT TARGET LIBRARY::LIBRARY_C)
add_library (LIBRARY::LIBRARY_C UNKNOWN IMPORTED)
set_target_properties (LIBRARY::LIBRARY_C PROPERTIES
IMPORTED_LOCATION ${LIBRARY_C_LIBRARY}
INTERFACE_INCLUDE_DIRECTORIES ${LIBRARY_INCLUDE_DIR})
endif ()
if (NOT TARGET LIBRARY::LIBRARY_Fortran)
add_library (LIBRARY::LIBRARY_Fortran UNKNOWN IMPORTED)
set_target_properties (LIBRARY::LIBRARY_Fortran PROPERTIES
IMPORTED_LOCATION ${LIBRARY_Fortran_LIBRARY}
INTERFACE_INCLUDE_DIRECTORIES ${LIBRARY_INCLUDE_DIR})
endif ()
if (NOT TARGET LIBRARY::LIBRARY)
add_library (LIBRARY::LIBRARY INTERFACE IMPORTED)
target_link_libraries (LIBRARY::LIBRARY INTERFACE LIBRARY::LIBRARY_C LIBRARY::LIBRARY_Fortran)
endif ()
endif ()
然后,当我去导入并链接到我自己的目标
cmake_minimum_required (VERSION 3.14)
project (my_project C Fortran)
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH};${CMAKE_CURRENT_SOURCE_DIR}/cmake)
find_package (LIBRARY MODULE REQUIRED)
add_library(my_library STATIC)
... # Add target sources here.
if (LIBRARY_FOUND)
target_link_libraries (my_library INTERFACE LIBRARY::LIBRARY)
endif ()
然后我在某个可执行文件中使用我的库
add_executable (my_program)
target_link_libraries (my_program my_library)
当我在本地开发机器(MacOS 10.14.6)上运行它时,一切都正常
my_程序
拾取所有编译定义,包括在链接目标上设置的目录和编译器标志属性。然而,当我尝试将它作为GitHub操作(ubuntu最新版本)运行时,它失败了。当我使用make VERBOSE=1
构建时,我可以看到库\u INCLUDE\u DIR
属性丢失。这两台机器运行的是同一版本的cmake。结果是修复程序要更改
if (LIBRARY_FOUND)
target_link_libraries (my_library INTERFACE LIBRARY::LIBRARY)
endif ()
到
将其链接为
接口
,意味着链接到我的库
的东西会看到include目录,但我的库
源没有。“我可以看到库的include\u DIR属性丢失。”-因此,这是脚本中失败的第一行。此问题与标题中所述的“梳理CMake库目标”有何关系?find_path
定义了library_INCLUDE_DIR
变量。是的,第一行find_path
定义了library_INCLUDE_DIR
变量。如果未找到头文件,则变量设置为-NOTFOUND
。“我可以看到LIBRARY\u INCLUDE\u DIR
属性缺失。”你是指最新的案例,对吗?它发现标题很好。哦,然后我错误地理解了你的问题陈述——“我可以看到LIBRARY\u INCLUDE\u DIR属性缺失。”。你能详细说明一下吗?这是否意味着LIBRARY\u INCLUDE\u DIR
的值没有传递给编译器?如果是,您是否尝试过(出于调试目的)与单独的目标链接是否有效:目标链接库(my_library INTERFACE library::library_C library::library_FORTRAN)
?
if (LIBRARY_FOUND)
target_link_libraries (my_library PUBLIC LIBRARY::LIBRARY)
endif ()