【问题标题】:qmake to Cmake transition: syntax for external librairiesqmake 到 Cmake 的转换:外部库的语法
【发布时间】:2018-01-16 02:45:48
【问题描述】:

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

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

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

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

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,但是库没有链接到:

我的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 )

这不起作用...

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

  • 确保扫描外部包含文件夹

  • 链接到我的 3 个库 osvrClientKit osvrClient osvrCommon。

事实上,我也对一个好的解释感兴趣。 提前致谢。

编辑:感谢 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} )

【问题讨论】:

    标签: cmake linker qmake


    【解决方案1】:

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

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

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

    请注意,每个库都需要一个单独的find_library 调用!由于您的库似乎具有相互依赖关系,因此在 CMake 中对其建模的正确方法是还为每个库添加一个导入的目标,然后添加 model the interdependencies on those targets correctly

    如果您还不愿意这样做,您还可以按正确的顺序将所有查找库添加到单个 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})
    

    请注意,尽管这种方法在未来的变化方面非常脆弱,通常应避免使用导入的目标。

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

    【讨论】:

    • 谢谢。我花了一些时间阅读和消化,但这让 cmake 正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2021-09-17
    相关资源
    最近更新 更多