【问题标题】:Why won't cmake permit <> style include?为什么 cmake 不允许 <> 样式包含?
【发布时间】:2020-11-01 22:36:10
【问题描述】:

我对 cmake 很陌生,但我在 Visual Studio 上使用它来开发一个必须在 linux 上运行的程序。我需要以这种方式包含以下内容:

#include <xscontroller/xscontrol_def.h>
#include <xscontroller/xsdevice_def.h>
#include <xscontroller/xsscanner.h>
#include <xstypes/xsoutputconfigurationarray.h>
#include <xstypes/xsdatapacket.h>
#include <xstypes/xstime.h>
#include <xscommon/xsens_mutex.h>

但是,只有当我执行以下操作时,Visual Studio 才能识别这些文件:

#include "xscontroller/xscontrol_def.h"
#include "xscontroller/xsdevice_def.h"
#include "xscontroller/xsscanner.h"
#include "xstypes/xsoutputconfigurationarray.h"
#include "xstypes/xsdatapacket.h"
#include "xstypes/xstime.h"
#include "xscommon/xsens_mutex.h"

我在 VS 中的项目结构相当简单:

ANT
-out
-xscommon
-xscontroller
-xstypes
-ANT.cpp
-CMakeLists.txt
.
.
.

我需要的包含在三个 xs 文件夹中,我相信它们必须在 Visual Studio 中以及将代码编译到 linux 上时都用 引用,因为每个标头中的引用都是以 形式完成的,这是导致此错误的原因:

xscallbackplainc.h:68:10: fatal error: xstypes/pstdint.h: No such file or directory
 #include <xstypes/pstdint.h>
          ^~~~~~~~~~~~~~~~~~~

编译时。

简而言之,我真的只需要知道什么命令(无论是在 CMakeLists.txt 中还是在其他地方)将允许在项目中进行这种引用,并在 linux 上通过 ssh 编译项目。我知道#include ""#include &lt;&gt; 之间的区别,但是我对cmake 还是陌生的,并且到处找过,找不到答案。

【问题讨论】:

    标签: c++ cmake directory cmakelists-options


    【解决方案1】:

    最简单的方法是使用include_directories 命令。只需将以下内容添加到您的ANT/CMakeLists.txt

    include_directories(${CMAKE_CURRENT_SOURCE_DIR})
    

    虽然我强烈建议改用target_include_directories()。两者的区别在于target_include_directories() 只为一个target[1]指定了包含目录。

    [1]。 target 是通过add_executable()add_library() 指定的任何内容:

    cmake_minimum_required(VERSION 3.12)
    
    project(ANT)
    
    add_executable(ANT ANT.cpp) #other source files as necessary
    
    #format of target_include_directories:
    # target_include_directories(target_name PUBLIC|PRIVATE PATH_TO_DIR) 
    
    target_include_directories(ANT PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
    

    【讨论】:

    • 好的,已经解决了包含问题,非常感谢。是链接类似的情况吗?当包含 Linux 程序的库时,我在寻找什么?我没有看到任何 .lib 文件,但我看到了相当多的 .cpp.o、co 和 .a 文件……我的阅读告诉我这些文件很重要,我认为它们是一些未解决的原因参考文献,因为我不知道如何包含它们。
    • 链接是使用target_link_libraries(target_name PUBLIC|PRIVATE LIBRARY_NAME} 完成的,其中库名可以是共享库或项目内部构建的静态库。您可以在add_executable() 之前执行add_library(lib lib.c source_files...),然后像target_link_libraries(ANT PRIVATE lib) 一样链接
    • 对于外部库,您通常必须首先使用find_library()find_package() 找到它们,然后使用target_link_libraries() 链接。如果您仍然卡住,我建议您发布另一个问题 with 您的 cmake 文件以及您要链接/构建的库。
    • 我现在就去做。我的包含工作正常,只是没有图书馆的链接。 (我希望这些在 cmake 中的含义与在 Visual Studio 中的含义相同)
    • 包含和链接是不同的cmake。
    【解决方案2】:

    我已经发布了有关链接的问题,希望它有意义。应该清楚我不知道我在做什么。

    【讨论】:

    • 您将此帖子作为答案发布,但该内容不是答案。我看到您为您的问题帖子发布了类似的评论,因此只需删除该“答案”即可。
    猜你喜欢
    • 2010-11-10
    • 2014-02-19
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多