qmake to Cmake过渡:外部图书馆的语法

时间:2018-01-16 02:45:49

标签: cmake linker qmake

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

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

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

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

import csv
with open('log.csv') as csvfile:
    readCSV = csv.reader(csvfile, delimiter='\t')

    for row in readCSV:
        print(row)

现在我需要使用cmake,但该库未链接到:

我的cmake.txt的相关部分:

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/

哪个不起作用......

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

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

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

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

编辑:感谢ComicSansMs的回复以及后人的工作Cmake语法:

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 )

并沿着赛道走下去:

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})

1 个答案:

答案 0 :(得分:0)

您对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})

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

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