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