所以,我正在尝试在CentOS上构建一个需要gtkglextmm的应用程序。到目前为止,我抓住了源代码(来自here)的gtkglext和gtkglextmm,并且(最后)想出了如何编译它们并使用./configure
然后make
然后{{1}来安装它们}。让它发挥作用非常酷。
现在,我正在尝试使用sudo make install
构建Degate,并且抱怨它无法找到gtkglextmm。我需要做些什么才能获得我构建的gtkglextmm库,可用于cmake?
改写:使用cmake
,a
构建并安装了库make
。现在想要使用cmake构建依赖于make install
的应用程序b
。怎么样?
谢谢!
答案 0 :(得分:0)
这是我们采用cmake时为我的团队做的新笔记。它简要总结了我认为在新手的例子中的某些内容。虽然有参考资料并且适合初学者,但我对材料很陌生,这个例子也可能因此受到影响。
此问题的一般信息位于:https://cmake.org/Wiki/CMake:How_To_Find_Libraries - 特别是,find_package
可用于help命令列出的任何命名包:
cmake --help-module-list
注意:'查找'被省略(例如,FindLibXml2 - > find_package(LibXml2))
但是,对于这种类型的库,它更有可能不在该列表中,在这种情况下,您希望使用find_library和find_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提供有关它应该在何处找到该库的更多信息。还有其他Q& A专门讨论这个主题 - 我最喜欢的是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-04-08被有效地重写了。