【问题标题】:How to make package built with make install available for cmake?如何使使用 make install 构建的软件包可用于 cmake?
【发布时间】:2015-07-29 23:29:32
【问题描述】:

所以,我正在尝试在 CentOS 上构建一个需要 gtkglextmm 的应用程序。到目前为止,我获取了 gtkglext 和 gtkglextmm 的源代码(来自here),并且(最终)弄清楚了如何使用./configure 然后make 然后sudo make install 来编译和安装它们。让它发挥作用真是太酷了。

现在,我正在尝试使用 cmake 构建 Degate,但它抱怨找不到 gtkglextmm。我需要做什么才能让我构建的 gtkglextmm 库可用于 cmake?

改写:使用make,make install 构建并安装库a。现在想用 cmake 构建依赖于a 的应用程序b。怎么样?

谢谢!

【问题讨论】:

  • 对此不是 100% 确定,但可能是它正在将库安装到 /usr/local,然后 Degate 找不到它,因为它正在 /usr 中查找 - 如果是这种情况,您可以尝试使用configure --prefix=/usr && make && make install 重新安装 gtkglextmm。
  • @SteJ 不。不要不要那样做。您从源代码安装到包管理系统上的/usr。那是要求麻烦、问题和痛苦。
  • 假设 cmake 正在寻找与 gtkglextmm 相关的 pkg-config 文件,那么它可能只是没有适合它们的 /usr/local 路径。您可以在运行 cmake 等之前尝试设置 PKG_CONFIG_PATH 以包含适当的路径,看看是否有帮助。
  • 好主意,我试过了,但没有用。这对我来说似乎很有意义......还有其他想法吗?......糟糕......
  • @EtanReisner 好吧,我在看到您的评论之前就尝试过...而且我想我的新任务是撤消我所做的...通过手动删除已安装的文件?我会看看如何设置该变量。

标签: cmake makefile


【解决方案1】:

这是我们采用 cmake 时为我的团队做的新手笔记。它简要总结了我认为在新手示例中的某个地方。虽然有参考资料并且适合新手,但我对材料很陌生,这个例子可能会因此受到影响。

此问题的一般信息位于:https://cmake.org/Wiki/CMake:How_To_Find_Libraries - 特别是,find_package 可用于帮助命令列出的任何命名包:
cmake --help-module-list 注意:“Find”被省略(例如,FindLibXml2 -> find_package(LibXml2))

但是,对于这种类型的库,它更有可能不在该列表中,在这种情况下,您希望使用 find_libraryfind_path 来代替。一个简单的例子是:

find_library(SQLITE3_LIB sqlite3) # simple because I did not need to give paths
find_path(SQLITE3_PATH sqlite3.h)
target_link_libraries( your_target_name ${SQLITE3_LIB} )
include_directories( ${SQLITE3_PATH} )

你不需要测试它们是否有'-NOTFOUND'返回值,因为如果有,cmake 将退出并报错:

...
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
SQLITE3_LIB
     linked by target "test" in directory /home/matlab/QFDC_ROOT/api

-- Configuring incomplete, errors occurred!

请注意,全大写的“SQLITE3_LIB”和“SQLITE3_PATH”是我选择的变量名。您选择变量名称。如果您有其他库和包含目录,您可以在此之前和之后列出它们并用空格分隔(我按照它们的链接顺序对它们进行了一致的排序,尽管我认为包含路径不敏感)。

您的情况可能不那么简单,在这种情况下,您想使用find_library 中描述的 CMake 功能来为 CMake 提供有关应在何处找到该库的更多信息。还有其他专门针对该主题的问答 - 我最喜欢的是produce your own FindXXX.cmake(尽管这是一个非常简洁的答案,指向您的示例)。

在很多情况下,运行make VERBOSE=1 来帮助您解决过程会很有帮助,例如cd build && cmake .. && make VERBOSE=1

为了更好的诊断,我使用DLRdave's answer 打印出 INCLUDE_DIRS,并使用一条简单的消息返回变量的结果:

message( STATUS "SQLITE3_LIB: ${SQLITE3_LIB} SQLITE3_PATH: ${SQLITE3_PATH}")
get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
foreach(dir ${dirs})
  message(STATUS "dir='${dir}'")
endforeach()

编辑注意:在发现前一天的实现错误和混淆 find_library() 和 find_path() 之后,这个答案在 2016 年 4 月 8 日被有效地重写。

【讨论】:

    猜你喜欢
    • 2022-11-07
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    相关资源
    最近更新 更多