对于我的项目,我在一个单独的文件夹中构建特定版本的依赖库,比如说/home/ubuntu/libs
。
我能够构建freetype库,make
将头文件安装到/home/ubuntu/libs/include
中,将构建的库安装到/home/ubuntu/libs/lib
中,还将freetype-config.cmake
添加到/home/ubuntu/libs/lib/cmake
中。
现在,我正在尝试构建依赖于freetype的freetype-gl库,并且在它的CMakeLists.txt中有一行find_package(freetype REQUIRED)
。
通常,当我将freetype库安装到/usr/local/lib
或/usr/lib
这样的公共路径时,cmake
会从相应的./cmake目录中拾取***-config.cmake**文件。
cmake -DCMAKE_TOOLCHAIN_FILE=/my/custom/toolchain -DCMAKE_LIBRARY_PATH=/home/ubuntu/libs/lib -DCMAKE_INCLUDE_PATH=/home/ubuntu/libs/include /path/to/freetype-gl
它将失败,并显示以下错误
CMake Error at CMakeLists.txt:102 (find_package):
By not providing "Findfreetype.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "freetype",
but CMake did not find one.
Could not find a package configuration file provided by "freetype" with any
of the following names:
freetypeConfig.cmake
freetype-config.cmake
Add the installation prefix of "freetype" to CMAKE_PREFIX_PATH or set
"freetype_DIR" to a directory containing one of the above files. If
"freetype" provides a separate development package or SDK, be sure it has
been installed.
我做错了什么?如何显示“freetype-config.cmake”到cmake的位置。
2条答案
按热度按时间gfttwv5a1#
正如你在第二段所说:
我能够构建自由类型库,make将头文件安装到/home/ubuntu/libs/include中,将构建的库安装到/home/ubuntu/libs/lib中,还将freetype-config.cmake添加到**/home/ubuntu/libs/lib/cmake中。**
CMake中的find_package()在默认情况下会检查标准系统路径。如果您使用的是CMake 3.17版本,则只需在CMakeLists.txt中添加以下行即可查看这些路径(无需阅读文档
在你的例子中,你需要做的是把CMake指向你要找的cmake文件的正确方向,在你的例子中,应该是**/home/ubuntu/libs/lib/cmake**.所以在你的CMakeLists.txt的顶部某处(在你调用find_package()之前)添加这一行:
假设此bash命令:
返回freetypeConfig.cmake的出现次数(您将得到演练:)
您可以在此处阅读有关CMAKE_MODULE_PATH变量的信息:https://cmake.org/cmake/help/latest/variable/CMAKE_MODULE_PATH.html
简而言之,CMake找不到配置文件是因为它不在它期望找到的标准路径中。
编辑:你当然可以通过错误提示的这些变量- CMAKE_PREFIX_PATH或freetype_DIR-做同样的事情
zmeyuzjn2#
假设您也不希望您构建的库找到安装在我们系统上的依赖项(如果有的话)。
我花了一些时间研究如何隔离CMake构建,我的最佳方法如下。
首先是术语:
include
和lib
子目录中)。:
字符,在Linux上为;
字符(交叉编译时,主机系统起作用,而不是目标)。是的,这和文件上说的正好相反。
我所说的Windows是指MSYS 2。如果你想在它之外构建,检查
:
是否仍然是正确的分隔符。CMake的环境变量:
PKG_CONFIG_PATH
到空字符串PKG_CONFIG_LIBDIR
添加到以:
分隔的列表中,对于每个依赖项,添加<prefix>/lib/pkgconfig
和<prefix>/share/pkgconfig
。(我不需要为我使用的任何库做这个,所以这是理论上的。但是在任何情况下都不要让这个变量置为空,至少使用一个空字符串。否则一些不希望的系统依赖项可能会泄漏进来。)
CMake标志:
-DCMAKE_INSTALL_PREFIX=...
-此库的安装前缀。-DCMAKE_PREFIX_PATH=...
-路径列表:安装前缀,后跟所有依赖项的前缀。使用CMake路径分隔符,如上所述。此处的所有路径必须是绝对路径。-DCMAKE_FIND_USE_CMAKE_SYSTEM_PATH=OFF
如果我没记错的话,不这样做会让CMake在PATH中列出的目录和它们的父目录中查找依赖项,这很烦人。
这会导致禁用一些
..._SYSTEM_...
CMake变量,因此我们不能使用这些变量,尽管其中一些变量可能更合适。-DCMAKE_STAGING_PREFIX=/
。在Windows主机上,将/
替换为当前驱动器名称,例如C:
。这仅在交叉编译时有用,可在工具链文件中禁用
CMAKE_FIND_ROOT_PATH
的效果,否则会将依存关系搜索限制在该路径。这也会打乱原本从
CMAKE_INSTALL_PREFIX
开始的安装路径,修复方法如下所述。-DCMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH=OFF
-否则CMake倾向于在PATH
和父目录中查找依赖项,这很烦人。这是硬编码,只发生在Windows * 主机 * 上,这是毫无意义的,报告为here。我们不希望无条件地设置此选项,因为它会产生要求所有工具链可执行文件都位于同一目录的副作用,这通常很烦人,但在Windows上可以容忍。
它还阻止CMake搜索
PATH
中的可执行文件,因此我们还需要...-DCMAKE_PROGRAM_PATH=
-将其设置为PATH
的内容,将原始分隔符替换为CMake路径分隔符。至少在MSYS 2上分隔符是相同的,因此不需要修改。-DCMAKE_MAKE_PROGRAM=ninja -GNinja
-这里CMAKE_MAKE_PROGRAM
在Windows主机上是绝对必要的,因为CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH=OFF
,并且不会伤害其他平台。-G...
是为了确保CMake不会选择一个不同的生成器,不匹配CMAKE_MAKE_PROGRAM
。如果你愿意,你可以使用任何其他生成器+程序。然后照常使用
cmake --build <build_dir> -j<num_threads>
构建。使用
cmake --install <build_dir> --prefix <prefix>
安装。由于CMAKE_STAGING_PREFIX=/
,我们需要显式设置前缀。