qmake 到 Cmake 的转换:外部库的语法

qmake to Cmake transition: syntax for external librairies

对于一个特定的项目,我将退出 qmake,现在必须使用 cmake。

我的路径如下: 资料来源:~/Projects/Project

外部静态库(本例中为 OSVR)路径:~/osvr/lib/ , ~/osvr/include/osvr /osvr/include/jsoncpp

使用 qmake,该库的 linking 部分曾经是:

INCLUDEPATH += /usr/include

LIBS += -L$$PWD/../../osvr/lib/ -losvrClientKit -losvrClient -losvrCommon    -losvrUtil -ljsoncpp

INCLUDEPATH += $$PWD/../../osvr/include/
INCLUDEPATH += $$PWD/../../jsoncpp/include/
DEPENDPATH += $$PWD/../../osvr/lib/

现在我需要使用 cmake,但库未 linked 为:

我cmake.txt的相关部分:

set(OSVR_DIR /home/pilou/osvr)
set(OSVR_INCLUDE_DIR /home/pilou/osvr/include/osvr/ClientKit)
find_library(OSVR_LIBRARIES ${OSVR_DIR}/lib)

[...]

target_link_libraries(myexec ${QT_LIBRARIES} ${OSVR_LIBRARIES} )
target_include_directories(myexec PUBLIC include ${OSVR_DIR}/include )

哪个不行...

一点帮助会很可爱,因为我不太确定如何:

其实我也很想有一个好的解释。 提前致谢。

编辑:感谢 ComicSansMs 的回复和后代,工作的 Cmake 语法:

set(OSVR_DIR /home/pilou/osvr)
set(OSVR_INCLUDE_DIR /home/pilou/osvr/include)
find_library(OSVR_CLIENT_KIT_LIBRARY osvrClientKit HINTS ${OSVR_DIR}/lib)
find_library(OSVR_CLIENT_LIBRARY osvrClient HINTS ${OSVR_DIR}/lib)
find_library(OSVR_COMMON_LIBRARY osvrCommon HINTS ${OSVR_DIR}/lib)
find_library(OSVR_UTIL_LIBRARY osvrUtil HINTS ${OSVR_DIR}/lib)
find_library(JSONCPP_LIBRARY jsoncpp HINTS ${OSVR_DIR}/lib/x86_64-linux-gnu)
set(OSVR_LIBRARIES ${OSVR_CLIENT_KIT_LIBRARY} ${OSVR_CLIENT_LIBRARY} ${OSVR_COMMON_LIBRARY} ${OSVR_UTIL_LIBRARY} ${JSONCPP_LIBRARY})

沿着轨道:

target_link_libraries(myExec ${QT_LIBRARIES} ${OSVR_LIBRARIES} )
target_include_directories(myExec PUBLIC include ${OSVR_INCLUDE_DIR} )

您对 find_library 的使用看起来不对。

查看 manpage for find_library。您必须提供要查找的库的名称作为参数。您可以选择提供额外的提示,在哪里可以找到该库:

find_library(OSVR_COMMON_LIBRARY osvrCommon
             HINTS ${OSVR_DIR}/lib)

请注意,您需要为每个库调用一个单独的 find_library!由于您的库似乎具有相互依赖性,因此在 CMake 中为它们建模的正确方法是还为每个库添加一个导入的目标,然后 .

如果您觉得这样做还不自在,您还可以将所有查找库以正确的顺序添加到一个 OSVR_LIBRARIES 变量中,然后依赖它:

find_package(OSVR_COMMON_LIBRARY ...)
find_package(OSVR_CLIENT_LIBRARY ...)
find_package(OSVR_CLIENTKIT_LIBRARY ...)
 ...

set(OSVR_LIBRARIES ${OSVR_CLIENTKIT_LIBRARY} ${OSVR_CLIENT_LIBRARY} ${OSVR_COMMON_LIBRARY} ...)
target_link_libraries(myexec ${QT_LIBRARIES} ${OSVR_LIBRARIES})

请注意,尽管这种方法对于未来的更改非常脆弱,通常应避免使用导入目标。

此外,请确保您确实拥有适当的错误处理机制,以防您的查找调用实际上没有找到任何东西。