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
Cmake 依赖于外部资源的仅标题库的product.lib_Cmake_Subdirectory - Fatal编程技术网

Cmake 依赖于外部资源的仅标题库的product.lib

Cmake 依赖于外部资源的仅标题库的product.lib,cmake,subdirectory,Cmake,Subdirectory,编辑:我已经阅读并理解了最初的问题是由于扫描头没有cpp文件而导致的,因此没有生成lib文件。编辑问题以反映额外的理解: 我当前的项目文件夹结构和相关CMakeLists内容: leveling ├── CMakeLists.txt: add_subdirectory(deps) └── deps ├── CMakeLists.txt: add_subdirectory(scanning-header-only) └── scanning ├── CMakeLi

编辑:我已经阅读并理解了最初的问题是由于扫描头没有cpp文件而导致的,因此没有生成lib文件。编辑问题以反映额外的理解:

我当前的项目文件夹结构和相关CMakeLists内容:

leveling
├── CMakeLists.txt: add_subdirectory(deps) 
└── deps
    ├── CMakeLists.txt: add_subdirectory(scanning-header-only)
    └── scanning
        ├── CMakeLists.txt: add_subdirectory(deps)
        │                   add_library(scanning-header-only file.h)
        │                   target_include_directories(scanning-header-only PUBLIC ${CMAKE_CURRENT_LIST_DIR}/deps/tinyxml2)
        │                   target_link_libraries(scanning-header-only PUBLIC tinyxml2)
        └── deps
            ├── CMakeLists.txt: add_subdirectory(tinyxml2)
            └── tinyxml2
但是没有生成仅扫描头的库文件,因此根项目不能以链接库为目标(仅升级扫描头),必须
以包含目录为目标(升级${CMAKE\u CURRENT\u LIST\u DIR}/deps/scanning header only/deps/tinyxml2

是否可以将链接库定位为依赖于外部资源的标题库?

我看到一个没有外部资源依赖关系的只有头的库可以是
add\u library(…INTERFACE)
,但是我无法使用tinyxml2上的依赖关系

一个肮脏的解决方法是只在扫描头中添加空cpp文件,以便生成lib文件,但有正确的方法吗



以下是最简单的示例v1:

升级CMakeLists.txt: cmake_最低要求(3.8版)

扫描CMakeLists.txt

cmake_minimum_required(VERSION 3.8)

set(XML_NAME xml-reading)

project(${XML_NAME})

#
# To put tinyxml.dll next to the executable, to workaround having to make tinyxml2.dll reachable in PATH
#
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

math(EXPR platform_bits "${CMAKE_SIZEOF_VOID_P} * 8")
set(platform_dir bin/${CMAKE_SYSTEM_NAME}-${platform_bits})

foreach(config DEBUG RELEASE RELWITHDEBINFO MINSIZEREL)
    foreach(var
            CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${config}
            CMAKE_LIBRARY_OUTPUT_DIRECTORY_${config}
            CMAKE_RUNTIME_OUTPUT_DIRECTORY_${config}
            )
        set(${var} "${CMAKE_BINARY_DIR}/${platform_dir}/${config}")
        string(TOLOWER "${${var}}" ${var})
    endforeach()
endforeach()
#
# ----------------------------------------------------------------------
#

add_subdirectory(deps)

add_library(${XML_NAME} INTERFACE CamerasXML.h)
target_include_directories(${XML_NAME} INTERFACE
    ${CMAKE_CURRENT_LIST_DIR}/deps/tinyxml2
)
target_link_libraries(${XML_NAME} 
    INTERFACE tinyxml2
)
产生

CMake Error at deps/scanning/CMakeLists.txt:33 (add_library): 
  add_library INTERFACE library requires no source arguments. 

.lib
是指在Windows上创建静态(
.lib
)或共享(
.lib
.dll
)库。您需要的是一个接口库,它不生成任何文件。他有一个例子。然后,您可以使用下面列出的命令来填充界面。请注意,它使用的接口不是PUBLIC

target_link_libraries(INTERFACE),
target_link_options(INTERFACE),
target_include_directories(INTERFACE),
target_compile_options(INTERFACE),
target_compile_definitions(INTERFACE), and
target_sources(INTERFACE),
我从来没有实际使用过这个,但我假设它是文档化的。

一个简单的
add\u库(${XML\u NAME}接口)
(不指定任何源文件),同时拥有
target\u include\u目录(${XML\u NAME}接口${CMAKE\u CURRENT\u LIST\u DIR}/deps/tinyxml2)
target链接库(${XML\u NAME}接口tinyxml2)
就可以了


tinyxml2 include可用于父项目,tinyxml2库在父项目中链接。

目标目录的PUBLIC关键字应该会解决这个问题。任何针对“扫描”链接的目标都应该自动添加包含目录的内容。将您的示例简化为最小的CMakeLists.txt并发布…不,如果使用了
tinyxml2
target\u include\u目录(tinyxml2 PUBLIC.)
将其头文件作为目标定义的一部分,则不必为
扫描
目标添加额外的target\u include\u目录。然后它应该填充所有使用它的东西的include路径,比如
target\u link\u库(扫描tinyxml2)
。对于所有的include文件夹位置,您必须在顶层有一个
include_目录。正因为如此,我对这个问题有了更多的了解,并对问题进行了编辑,以反映出这一努力的成果,但我们还没有做到这一点。add_library(仅扫描标题的接口文件.h)target_link_library(仅扫描标题的接口tinyxml2)抱怨tinyxml2不是一个接口,有点糟糕:/huh,在创建了最简单的示例之后,这就完成了技巧:/:),txs和抱歉
target_link_libraries(INTERFACE),
target_link_options(INTERFACE),
target_include_directories(INTERFACE),
target_compile_options(INTERFACE),
target_compile_definitions(INTERFACE), and
target_sources(INTERFACE),