cmake 项目构建中的 Graphviz 失败 - header 未找到
Graphviz in cmake project build fails - header not found
我想用 C++ 创建一个示例 Cmake 项目,看看 Graphviz 是否可以在大型项目中用于文档目的。
我的项目结构是我将 graphviz 从 github 克隆到外部目录并执行 git submodule update --init --recursive
Project
|external
| graphviz
|main.cpp
|CMakeLists.txt
我的 Cmake 文件是
cmake_minimum_required(VERSION 3.17)
project(Example)
set(CMAKE_CXX_STANDARD 17)
set(SOURCES
main.cpp
)
add_subdirectory(external/graphviz)
add_executable(${PROJECT_NAME} ${SOURCES})
我使用 Windows 10 64 位、CLion 和编译器 LLVM Clang,并遵循指南 http://graphviz.org/doc/winbuild.html,因此我将 c:\Projekte\Example\external\graphviz\windows\dependencies\graphviz-build-utilities
添加到我的 Path 环境变量中。
因为 CMake 一开始就失败了,因为它找不到我添加到 Cmake 选项中的 Bison 和 Flex -DBISON_EXECUTABLE="c:\Projekte\Example\external\graphviz\windows\dependencies\graphviz-build-utilities\winflexbison\win_bison.exe" -DFLEX_EXECUTABLE="c:\Projekte\Example\external\graphviz\windows\dependencies\graphviz-build-utilities\winflexbison\win_flex.exe"
CMake 现在成功运行,我可以构建项目,但是当我尝试像这样包含 gvc header 时它失败了,尽管它在包含本身
上没有显示错误
#include "external/graphviz/lib/gvc/gvc.h"
int main() {
//do stuff
return 0;
}
这是输出
====================[ Build | Example | Debug_Clang ]===========================
"C:\Program Files\JetBrains\CLion 2020.3.2\bin\cmake\win\bin\cmake.exe" --build C:\Projekte\Example\cmake-build-debug_clang --target Example
[1/2] Building CXX object CMakeFiles\Example.dir\main.cpp.obj
FAILED: CMakeFiles/Example.dir/main.cpp.obj
C:\PROGRA~1\LLVM\bin\clang-cl.exe /nologo -TP -m64 /Zi /Ob0 /Od /RTC1 -MDd -std:c++17 /showIncludes /FoCMakeFiles\Example.dir\main.cpp.obj /FdCMakeFiles\Example.dir\ -c -- ..\main.cpp
In file included from ..\main.cpp:4:
../external/graphviz/lib/gvc/gvc.h(14,10): fatal error: 'types.h' file not found
#include "types.h"
^~~~~~~~~
1 error generated.
ninja: build stopped: subcommand failed.
找不到文件位于external/graphviz/lib/common
我试过的
我认为这是 Cmake 的问题,所以我尝试更改我的 Cmake 文件。通过删除 add:subdirectory()
命令并将其替换为
1.
add_executable(${PROJECT_NAME} ${SOURCES})
target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/external/graphviz)
target_link_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/external/graphviz)
target_link_libraries(${PROJECT_NAME} PRIVATE ${GRAPHVIZ_LIB})
add_executable(${PROJECT_NAME} ${SOURCES})
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/external/graphviz)
target_link_libraries(${PROJECT_NAME} PUBLIC cgraph gvc)
- 而不是target_include_directories()
include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/external/graphviz)
- 将库路径添加到 Cmake 选项 -DCMAKE_PREFIX_PATH="c:\Projekte\Example\external\graphviz\lib"
但我总是得到同样的错误。有人知道解决方案吗?
我直接在 graphviz 支持论坛上问了同样的问题并得到了答案,这是 Cmake 的一个已知问题并将我链接到这个线程
https://gitlab.com/graphviz/graphviz/-/issues/1477
Tl: 博士
Graphviz 目前无法构建为 Cmake 项目中的子目录。
我想用 C++ 创建一个示例 Cmake 项目,看看 Graphviz 是否可以在大型项目中用于文档目的。
我的项目结构是我将 graphviz 从 github 克隆到外部目录并执行 git submodule update --init --recursive
Project
|external
| graphviz
|main.cpp
|CMakeLists.txt
我的 Cmake 文件是
cmake_minimum_required(VERSION 3.17)
project(Example)
set(CMAKE_CXX_STANDARD 17)
set(SOURCES
main.cpp
)
add_subdirectory(external/graphviz)
add_executable(${PROJECT_NAME} ${SOURCES})
我使用 Windows 10 64 位、CLion 和编译器 LLVM Clang,并遵循指南 http://graphviz.org/doc/winbuild.html,因此我将 c:\Projekte\Example\external\graphviz\windows\dependencies\graphviz-build-utilities
添加到我的 Path 环境变量中。
因为 CMake 一开始就失败了,因为它找不到我添加到 Cmake 选项中的 Bison 和 Flex -DBISON_EXECUTABLE="c:\Projekte\Example\external\graphviz\windows\dependencies\graphviz-build-utilities\winflexbison\win_bison.exe" -DFLEX_EXECUTABLE="c:\Projekte\Example\external\graphviz\windows\dependencies\graphviz-build-utilities\winflexbison\win_flex.exe"
CMake 现在成功运行,我可以构建项目,但是当我尝试像这样包含 gvc header 时它失败了,尽管它在包含本身
#include "external/graphviz/lib/gvc/gvc.h"
int main() {
//do stuff
return 0;
}
这是输出
====================[ Build | Example | Debug_Clang ]===========================
"C:\Program Files\JetBrains\CLion 2020.3.2\bin\cmake\win\bin\cmake.exe" --build C:\Projekte\Example\cmake-build-debug_clang --target Example
[1/2] Building CXX object CMakeFiles\Example.dir\main.cpp.obj
FAILED: CMakeFiles/Example.dir/main.cpp.obj
C:\PROGRA~1\LLVM\bin\clang-cl.exe /nologo -TP -m64 /Zi /Ob0 /Od /RTC1 -MDd -std:c++17 /showIncludes /FoCMakeFiles\Example.dir\main.cpp.obj /FdCMakeFiles\Example.dir\ -c -- ..\main.cpp
In file included from ..\main.cpp:4:
../external/graphviz/lib/gvc/gvc.h(14,10): fatal error: 'types.h' file not found
#include "types.h"
^~~~~~~~~
1 error generated.
ninja: build stopped: subcommand failed.
找不到文件位于external/graphviz/lib/common
我试过的
我认为这是 Cmake 的问题,所以我尝试更改我的 Cmake 文件。通过删除 add:subdirectory()
命令并将其替换为
1.
add_executable(${PROJECT_NAME} ${SOURCES})
target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/external/graphviz)
target_link_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/external/graphviz)
target_link_libraries(${PROJECT_NAME} PRIVATE ${GRAPHVIZ_LIB})
add_executable(${PROJECT_NAME} ${SOURCES})
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/external/graphviz)
target_link_libraries(${PROJECT_NAME} PUBLIC cgraph gvc)
- 而不是target_include_directories()
include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/external/graphviz)
- 将库路径添加到 Cmake 选项 -DCMAKE_PREFIX_PATH="c:\Projekte\Example\external\graphviz\lib"
但我总是得到同样的错误。有人知道解决方案吗?
我直接在 graphviz 支持论坛上问了同样的问题并得到了答案,这是 Cmake 的一个已知问题并将我链接到这个线程 https://gitlab.com/graphviz/graphviz/-/issues/1477
Tl: 博士 Graphviz 目前无法构建为 Cmake 项目中的子目录。