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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/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
在GitHub操作下运行时,将多个cmake库目标合并为单个目标失败_Github_Cmake - Fatal编程技术网

在GitHub操作下运行时,将多个cmake库目标合并为单个目标失败

在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

我正在尝试使用现代cmake构建系统建立持续集成工作流GitHub。在这个构建系统中,我需要找到两个外部库,一个C和Fortran版本。因为这些库不是内置的FindLIBRARY,所以我必须创建自己的库。我还想设置它,以便两个库可以作为单个目标链接

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 ()