代码之家  ›  专栏  ›  技术社区  ›  Steve314

如何修复此cmake文件?-链接到导入的库时出现问题

  •  2
  • Steve314  · 技术社区  · 16 年前

    我只是从cmake开始,尝试建立一个相当简单的项目。尽管项目本身很简单,但它链接到许多不是由cmake构建的静态库。我想,它们可能是——它们是我的库——但我需要弄清楚如何链接到第三方库。

    这是我到目前为止得到的。。。

    cmake_minimum_required(VERSION 2.8.1)
    cmake_policy(VERSION 2.8.1)
    
    project( test01 )
    
    include_directories("../../cpplib/sh_core" "../../cpplib/sh_core2" "../../cpplib/sh_genlib")
    
    link_directories("../../cpplib/_vc_debug")
    
    add_library( sh_core   STATIC IMPORTED )
    add_library( sh_core2  STATIC IMPORTED )
    add_library( sh_genlib STATIC IMPORTED )
    
    add_executable( test01 test01 test01_ast test01_parse test01_scan test01_main )
    target_link_libraries(test01 sh_core sh_core2 sh_genlib)
    

    问题是我试图链接到的三个库在生成的项目文件中没有被正确引用。它们被列为 sh_core-NOTFOUND , sh_core2-NOTFOUND sh_genlib-NOTFOUND .

    认为 也许我不需要 link_directories 从上面看,但我需要一个 find_library

    所以。。。我怎么告诉cmake在哪里可以找到那些图书馆?

    额外的问题-如何设置它,使生成的项目同时处理调试版本和发布版本?注意-导入库的版本具有相同的文件名,但位于“../../cpplib/\u vc\u release”文件夹中。

    2 回复  |  直到 16 年前
        1
  •  6
  •   the_void    15 年前

    我想你误解了 include_directories add_library

    include_directories 添加要搜索包含文件的目录,而 add_library 可以这样使用(在您的情况下):

    add_library(core UNKNOWN IMPORTED)
    set_target_properties(core PROPERTIES IMPORTED_LOCATION "../../cpplib/_vs_release/core.lib")
    

    但是,如果我正确理解了您要实现的目标,那么像这样的事情应该可以做到:

    set(CPPLIB_DIR "${CMAKE_SOURCE_DIR}/../../cpplib")
    
    set(CPPLIB_DEBUG_DIR "${CPPLIB_DIR}/_vc_debug")
    set(CPPLIB_RELEASE_DIR "$(CPPLIB_DIR}/_vc_release")
    
    if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
        set(CPPLIB_LIB_HINT ${CPPLIB_RELEASE_DIR})
    else ()
        set(CPPLIB_LIB_HINT ${CPPLIB_DEBUG_DIR})
    endif ()
    
    find_library(CPPLIB_CORE_LIBRARY NAMES "core"
                                     PATHS ${CPPLIB_LIB_HINT})
    
    find_library(CPPLIB_CORE2_LIBRARY NAMES "core2"
                                      PATHS ${CPPLIB_LIB_HINT})
    
    find_library(CPPLIB_GENLIB_LIBRARY NAMES "genlib"
                                       PATHS ${CPPLIB_LIB_HINT})
    
    if (("${CPPLIB_CORE_LIBRARY}" STREQUAL "CPPLIB_CORE_LIBRARY-NOTFOUND") OR
        ("${CPPLIB_CORE2_LIBRARY}" STREQUAL "CPPLIB_CORE2_LIBRARY-NOTFOUND") OR
        ("${CPPLIB_GENLIB_LIBRARY}" STREQUAL "CPPLIB_GENLIB_LIBRARY-NOTFOUND"))
        message(FATAL_ERROR "One of the libs wasn't found!")
    endif ()
    
    set(CPPLIB_LIBRARIES ${CPPLIB_CORE_LIBRARY} ${CPPLIB_CORE2_LIBRARY} ${CPPLIB_GENLIB_LIBRARY})
    
    target_link_libraries(my_exe ${CPPLIB_LIBRARIES})
    

    find_path(CPPLIB_INCLUDE_DIR "my_header.h"
        PATHS ${CPPLIB_HINT_INCLUDE_DIR})
    
    ...
    
    include_directories(${CPPLIB_INCLUDE_DIR})
    
        2
  •  1
  •   Community Mohan Dere    9 年前

    后续行动 the_void's answer :

    您应该能够简化if测试表达式,其内容如下:

    if (("${CPPLIB_CORE_LIBRARY}" STREQUAL "CPPLIB_CORE_LIBRARY-NOTFOUND") OR
        ("${CPPLIB_CORE2_LIBRARY}" STREQUAL "CPPLIB_CORE2_LIBRARY-NOTFOUND") OR
        ("${CPPLIB_GENLIB_LIBRARY}" STREQUAL "CPPLIB_GENLIB_LIBRARY-NOTFOUND"))
        message(FATAL_ERROR "One of the libs wasn't found!")
    endif ()
    

    像这样:

    if (CPPLIB_CORE_LIBRARY OR
        CPPLIB_CORE2_LIBRARY OR
        CPPLIB_GENLIB_LIBRARY)
        message(FATAL_ERROR "One of the libs wasn't found!")
    endif ()
    

    参考 CMake's if statement .

    推荐文章