鉴于以下项目结构:
.
└── library/
├── CMakeLists.txt
├── include/
│ └── class1.hpp
├── src/
│ └── class1.cpp
├── build/
│ ├── _deps/
│ │ └── fmt-build
│ └── sample/
│ └── app_using_library.exe
└── sample/
├── CMakeLists.txt
└── main.cpp
程式库的CMakeLists.txt:
project(library)
include(FetchContent)
FetchContent_Declare(
fmt
URL https://github.com/fmtlib/fmt/releases/download/9.1.0/fmt-9.1.0.zip
)
FetchContent_MakeAvailable(fmt)
add_library(library STATIC
"src/class1.cpp"
"include/class1.hpp"
target_include_directories(library PUBLIC include)
target_link_libraries(library PRIVATE fmt::fmt)
应用程序使用库的CMakeLists.txt文件:
project(app_using_library)
add_executable(app_using_library main.cpp)
target_link_libraries(app_using_library PRIVATE library)
class1.hpp:#include "fmt/core.h" // cannot open source file "fmt/core.h"
class1.cpp:#include "fmt/core.h" // works fine
在构建library
和app_using_library
时,fmt头文件可以包含在class1.cpp中,而不能包含在class1.hpp中,是否有可能的原因或解释?在仅构建library
时,include在头文件中工作正常
编译器无法在“class1.hpp”中找到fmt头文件,但可以在“class1.cpp”中找到它们。
全错误:
FAILED: sample/CMakeFiles/app_using_library.dir/main.cpp.obj
C:\msys64\mingw64\bin\g++.exe -ID:/Programming/cpp/library/include -g -std=gnu++20 -MD -MT sample/CMakeFiles/app_using_library.dir/main.cpp.obj -MF sample\CMakeFiles\app_using_library.dir\main.cpp.obj.d -o sample/CMakeFiles/app_using_library.dir/main.cpp.obj -c D:/Programming/cpp/library/sample/main.cpp
In file included from D:/Programming/cpp/library/sample/main.cpp:2:
D:/Programming/cpp/library/include/class1.hpp:4:10: fatal error: fmt/core.h: No such file or directory
4 | #include "fmt/core.h"
| ^~~~~~~~~~~~
compilation terminated.
1条答案
按热度按时间bvhaajcl1#
编译“app_using_library”时失败,因为只有“library”知道fmt。要解决此问题,还需要将已定义的有关fmt的信息包含到app_using_library CMakeLists.txt中