c++ cmake的定制库目录

wixjitnu  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(241)

对于我的项目,我在一个单独的文件夹中构建特定版本的依赖库,比如说/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的位置。

gfttwv5a

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中添加以下行即可查看这些路径(无需阅读文档

SET(CMAKE_FIND_DEBUG_MODE TRUE)

在你的例子中,你需要做的是把CMake指向你要找的cmake文件的正确方向,在你的例子中,应该是**/home/ubuntu/libs/lib/cmake**.所以在你的CMakeLists.txt的顶部某处(在你调用find_package()之前)添加这一行:

LIST(APPEND CMAKE_MODULE_PATH "/home/ubuntu/libs/lib/cmake")

假设此bash命令:

ls /home/ubuntu/libs/lib/cmake | grep "*.cmake"

返回freetypeConfig.cmake的出现次数(您将得到演练:)
您可以在此处阅读有关CMAKE_MODULE_PATH变量的信息:https://cmake.org/cmake/help/latest/variable/CMAKE_MODULE_PATH.html
简而言之,CMake找不到配置文件是因为它不在它期望找到的标准路径中。
编辑:你当然可以通过错误提示的这些变量- CMAKE_PREFIX_PATH或freetype_DIR-做同样的事情

zmeyuzjn

zmeyuzjn2#

假设您也不希望您构建的库找到安装在我们系统上的依赖项(如果有的话)。
我花了一些时间研究如何隔离CMake构建,我的最佳方法如下。
首先是术语:

  • 库的安装“前缀”是安装二进制文件和头文件的目录(通常在includelib子目录中)。
  • 库的“依赖项”是它在编译时需要的任何其他库。
  • CMake路径分隔符-用于分隔CMake路径列表的字符。在Windows上为:字符,在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开始的安装路径,修复方法如下所述。

  • 仅限Windows主机:
  • -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=/,我们需要显式设置前缀。

相关问题