当前位置: 首页 > 知识库问答 >
问题:

错误C1083(文件未找到)与CMAKEtarget_include_directories

杨阳飇
2023-03-14

我在源代码树中将c项目拆分为几个不同的库/可执行文件。有一个顶级的Cmake文件,其中包括一些子目录。一个叶库B链接到另一个叶库A。然而,即使A公开添加了target_include_directories,在B中,我得到了错误C1083——无法打开包含文件。

操作系统:Win10

使用GCC 7.3.0工具包:

>

  • CMake命令“C:\Program Files\CMake\bin\CMake.EXE”-no warn unused cli-DMOCK\u SIMCONNECT:BOOL=TRUE”-DP3D\u SDK\u ROOT:STRING=C:/Program Files/Lockheed Martin/Prepar3D v4 SDK 4.5.14.34698”-DCMAKE\u EXPORT\u COMPILER\u命令:BOOL=TRUE-DCMAKE\u C\u COMPILER:FILEPATH=C:\Qt\Tools\mingw730\u 64\bin\gcc。exe-DCMAKE_CXX_编译器:FILEPATH=C:\Qt\Tools\mingw730_64\bin\g。exe-Hd:/repos/cmake_sample_project-Bd:/repos/cmake_sample_project/build-G“MinGW Makefiles”

    错误消息:

    [build] D:\repos\cmake_sample_project\src\B\libB.h:5:10: fatal error: libA.h: No such file or directory
    [build]  #include "libA.h"
    [build]           ^~~~~~~~
    [build] compilation terminated.
    

    使用工具包Visual Studio Build Tools 2017发布版-amd64:

    >

  • CMake命令:“C:\Program Files\CMake\bin\CMake.EXE”-no warn unused cli-DMOCK\u SIMCONNECT:BOOL=TRUE”-DP3D\u SDK\u ROOT:STRING=C:/Program Files/Lockheed Martin/Prepar3D v4 SDK 4.5.14.34698”-DCMAKE\u EXPORT\u COMPILE\u命令:BOOL=TRUE-DCMAKE\u BUILD\u TYPE:STRING=Debug-Hd:/repos/CMake\u sample\u project-Bd:/repos/CMake\u sample\u project/BUILD-G“Visual Studio 2017”-=15-x64

    错误消息:

    d:\repos\cmake_sample_project\src\b\libB.h(5): fatal error C1083: Datei (Include) kann nicht geöffnet werden: "libA.h": No such file or directory [D:\repos\cmake_sample_project\build\src\B\libB-obj.vcxproj]
    
    sample_cmake_project
    |   CMakeLists.txt
    |   
    +---src
    |   |   CMakeLists.txt
    |   |   
    |   +---A
    |   |   |   CMakeLists.txt
    |   |   |   libA.cpp
    |   |   |   
    |   |   \---public
    |   |           libA.h
    |   |           
    |   \---B
    |           CMakeLists.txt
    |           libB.cpp
    |           libB.h
    |           
    \---tests
            CMakeLists.txt
    

    样本_cmake_项目/CMakeLists。txt:

    cmake_minimum_required(VERSION 3.12)
    
    project(sample_project LANGUAGES CXX)
    
    add_subdirectory(src)
    
    enable_testing()
    add_subdirectory(tests)
    

    样本cmake项目/src/CMakeLists。txt

    add_subdirectory(A)
    add_subdirectory(B)
    

    示例cmake项目/src/A/CMakeLists。txt

    add_library(libA-obj OBJECT "")
    
    target_sources(libA-obj 
        PRIVATE
            ${CMAKE_CURRENT_SOURCE_DIR}/libA.cpp
        PUBLIC
            ${CMAKE_CURRENT_SOURCE_DIR}/public/libA.h # <-- header is added as public source.
    )
    
    add_library(libA STATIC $<TARGET_OBJECTS:libA-obj>)
    
    target_include_directories(libA PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/public) # <-- public dir is added to the target's PUBLIC include directories.
    
    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/public)
    

    样本项目/src/B/CMakeLists。txt:

    add_library(libB-obj OBJECT "")
    
    target_sources(libB-obj 
        PRIVATE
            ${CMAKE_CURRENT_SOURCE_DIR}/libB.cpp
        PUBLIC
            ${CMAKE_CURRENT_SOURCE_DIR}/libB.h
    )
    
    add_library(libB STATIC $<TARGET_OBJECTS:libA-obj>)
    
    target_link_libraries(libB PRIVATE libA)
    
    include_directories(${CMAKE_CURRENT_SOURCE_DIR})
    

    示例_cmake_project/src/A/public/libA。h:

    #ifndef __LIBA_H
    #define __LIBA_H
    
    #include <iostream>
    
    class A 
    {
        public:
        A() { std::cout << "hello" << std::endl; };
        ~A() { std::cout << "bye bye" << std::endl; };
    
        void saySomething();
    };
    
    #endif
    

    样本_cmake_项目/src/A/libA。cpp:

    #include "libA.h"
    
    void A::saySomething()
    {
        std::cout << "something..." << std::endl;
    }
    

    示例_cmake_project/src/B/libB。h:

    #ifndef __LIB_B
    #define __LIB_B
    
    #include <iostream>
    #include "libA.h"
    
    class B
    {
    public:
        B();
        ~B();
    
        void saySomething();
    
    private:
        A _a;
    };
    
    #endif
    

    sample_cmake_project/src/B/libB. cpp:

    #include "libB.h"
    
    B::B() :
        _a(A())
    {
        std::cout << "Hello from lib B" << std::endl;
        _a.saySomething();
    }
    

    我觉得我可能遗漏了一些基本的东西,但是我认为通过将sample_cmake_project/A/public添加到libA目标的包含目录中,libA. h头应该可以用于链接到libA的库,例如libB?

    有什么建议吗?提前谢谢。


  • 共有1个答案

    惠凯歌
    2023-03-14

    错误消息指向libB-obj,这是用于创建静态库libB的对象库。libB-obj没有链接到libA,因此libA的公共包含目录不适用于libB-obj。

    add_library(libB-obj OBJECT "")
    
    target_sources(libB-obj 
        PRIVATE
            ${CMAKE_CURRENT_SOURCE_DIR}/libB.cpp
        PUBLIC
            ${CMAKE_CURRENT_SOURCE_DIR}/libB.h
    )
    
    add_library(libB STATIC $<TARGET_OBJECTS:libA-obj>)
    
    target_link_libraries(libB-obj PRIVATE libA) # --> link libB-obj instead of static library libB!
    
    include_directories(${CMAKE_CURRENT_SOURCE_DIR})
    
     类似资料:
    • 在我的新工作场所,我在新安装的Tomcat上遇到了一些日志文件未找到的错误。这些Tomcat日志文件是catalina.log、localhost_access_log.txt等。那些Tomcat日志文件不在/logs下。该问题同时出现在Windows7上的Tomcat9和Tomcat8上。Windows访问限制会导致此问题吗?

    • scala代码是: 打包以后的jar中有stopwords.dic这个文件 路径也是对的 但是还是报错了: Caused by: java.io.FileNotFoundException: file:/Users/laiyinan/Desktop/cc_core/out/artifacts/cc/cc_core.jar!/stopwords.dic (No such file or direct

    • 我无法为iOS构建颤动项目,给我的错误如下 尝试 吊舱拆卸 rm ios/颤抖/颤抖。podspec 颤振清洁 扑扑酒吧获取 吊舱安装 清除导出数据 颤振运行 仍然一样,我无法摆脱这个错误。我甚至尝试从pubsec.yaml中删除路径提供程序插件 任何帮助都将非常感谢,因为我已经坚持了24小时

    • 问题内容: 我正在尝试使用Jenkins-CI自动构建一个使用Restkit的iOS项目,显然,restkit作为一个项目驻留在主项目中。并且该项目使用XCode- IDE成功构建。 但是当我使用xcodebuild(jenkins使用它并且我确实模拟了它)来构建项目时,它给出了 任何线索出了什么问题,可以使用方案文件纠正此问题吗?如果可以,怎么办?还是可以模拟,XCode-IDE如何处理呢? 问

    • 我正在尝试分发该应用程序的新版本(可以安装OTA),但我收到错误: 我在周末花了很多时间在这里和互联网上寻找解决方案,只是为了消除我在试图存档应用程序以“临时”分发它时出现的两个错误之一。 我做了一些捕获屏幕来澄清我做了什么: 开发人员站点上的配置文件: 我的帐户:证书和配置文件: 项目设置: 目标设置(当我删除项目.pbxproj中的行PROVISIONING_PROFILE时,Xcode更改了

    • 我正在尝试(失败)设置一个简单的FastAPI项目,并使用uvicorn运行它。这是我的代码: 这是我从终端运行的内容: 如你所见,我找不到404。原因可能是什么?一些与网络相关的东西,可能是防火墙/vpn阻止此连接或其他什么?我是新来的。提前谢谢!