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 )
哪个不行...
一点帮助会很可爱,因为我不太确定如何:
确保扫描外部包含文件夹
到 link 我的 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
的使用看起来不对。
查看 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})
请注意,尽管这种方法对于未来的更改非常脆弱,通常应避免使用导入目标。
此外,请确保您确实拥有适当的错误处理机制,以防您的查找调用实际上没有找到任何东西。
对于一个特定的项目,我将退出 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 )
哪个不行...
一点帮助会很可爱,因为我不太确定如何:
确保扫描外部包含文件夹
到 link 我的 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
的使用看起来不对。
查看 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})
请注意,尽管这种方法对于未来的更改非常脆弱,通常应避免使用导入目标。
此外,请确保您确实拥有适当的错误处理机制,以防您的查找调用实际上没有找到任何东西。