piw*_*iwi 6 windows cygwin build-process pkg-config cmake
为了在 Windows 上移植 Linux 程序(使用 cygwin 和 gcc),我试图正确找到提供pkg-config文件的库(在我的情况下,这些库是由 Graphviz 带来的)。
直接的方法适用于 Linux:
find_package(PkgConfig)
pkg_check_modules(LIB_GRAPHVIZ libcdt libgvc libgraph)
Run Code Online (Sandbox Code Playgroud)
在 Windows 上,我使用安装程序(cygwin 路径:)手动安装了 Graphviz /cygdrive/c/graphviz。为了找到这些pkg-config文件,我导出了PKG_CONFIG_PATH变量,以便.pc在配置 CMake 之前找到这些文件:
export PKG_CONFIG_PATH=/cygdrive/c/graphviz/pkgconfig
cmake $srcdir
Run Code Online (Sandbox Code Playgroud)
配置工作正常,但是.pc文件没有适当的前缀(这会导致包含和链接目录无效):
$ pkg-config --variable=prefix libgraph
/c/graphviz-mingw/local.2.20.3
Run Code Online (Sandbox Code Playgroud)
关于pkg-config,解决方案是使用--define-variable参数调用它,例如这里是如何获得有效的includedir:
$ pkg-config --define-variable=prefix=/cygdrive/c/graphviz --variable=includedir libgraph
/cygdrive/c/graphviz/include/graphviz
Run Code Online (Sandbox Code Playgroud)
我的问题:如何在 CMake 中调用它时提供--define-variable参数pkg-config?
PkgConfig定义PKG_CONFIG_EXECUTABLE指向pkg-config程序的那个;我试图将我的选项附加到这个变量:
set(PKG_CONFIG_EXECUTABLE "${PKG_CONFIG_EXECUTABLE} --define-variable=/cygdrive/c/graphviz")
Run Code Online (Sandbox Code Playgroud)
但pkg_check_modules()未能检测到我的库。我的理解是调用将execute_process()的内容${PKG_CONFIG_EXECUTABLE}视为无效程序。
我可以使用任何解决方法来解决我的问题?
编辑:实际上,一个简单的解决方法是使用不同的.pc文件。但我很好奇是否可以在不更改这些文件的情况下解决问题。
感谢您的覆盖想法PKG_CONFIG_EXECUTABLE!如果参数用分号分隔,这确实对我有用,如下所示:
set(PKG_CONFIG_EXECUTABLE "${PKG_CONFIG_EXECUTABLE};--define-variable=/cygdrive/c/graphviz")
Run Code Online (Sandbox Code Playgroud)
CMake 会将其视为一个列表,并且由于execute_process()需要命令参数列表,因此效果很好(在 Linux 下使用 CMake 3.17 进行了测试)。
| 归档时间: |
|
| 查看次数: |
540 次 |
| 最近记录: |