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



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

我的路径如下: 来源 : ~/项目/项目

外部静态库(在本例中为 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} )

你对find_library的使用看起来是错误的。

查看手册页以了解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})

但请注意,这种方法对于未来的变化非常脆弱,一般应避免使用,以支持导入的目标。

此外,请确保您确实具有适当的错误处理机制,以防查找调用实际上未找到任何内容。

最新更新