【问题标题】:Why spdlog/pthread include directory is empty via pkg_search_module in CMake on macos?为什么 spdlog/pthread 包含目录在 macos 上通过 CMake 中的 pkg_search_module 为空?
【发布时间】:2019-06-12 04:48:36
【问题描述】:

环境

都是最新版本。

CMakeLists.txt

CMakeLists.txt 是:

project(xeditd LANGUAGES CXX VERSION 0.1)

find_package(PkgConfig REQUIRED)
pkg_search_module(ICU_UC icu-uc)
pkg_search_module(SPDLOG spdlog)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ICU_UC_CXXFLAGS_OTHER}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SPDLOG_CXXFLAGS_OTHER}")

set(SRC_FILE
    xeditd.cpp
    )

set(LIB_DIR
    ${ICU_UC_LIBRARY_DIRS}
    ${SPDLOG_LIBRARY_DIRS}
    )

set(LIB
    ${ICU_UC_LIBRARIES}
    ${SPDLOG_LIBRARIES}
    )

set(INC_DIR
    ${ICU_UC_INCLUDE_DIRS}
    ${SPDLOG_INCLUDE_DIRS}
    )

message(ICU_UC_CXXFLAGS_OTHER: ${ICU_UC_CXXFLAGS_OTHER})
message(SPDLOG_CXXFLAGS_OTHER: ${SPDLOG_CXXFLAGS_OTHER})
message(ICU_UC_LIBRARY_DIRS: ${ICU_UC_LIBRARY_DIRS})
message(SPDLOG_LIBRARY_DIRS: ${SPDLOG_LIBRARY_DIRS})
message(ICU_UC_LIBRARIES: ${ICU_UC_LIBRARIES})
message(SPDLOG_LIBRARIES: ${SPDLOG_LIBRARIES})
message(ICU_UC_INCLUDE_DIRS: ${ICU_UC_INCLUDE_DIRS})
message(SPDLOG_INCLUDE_DIRS: ${SPDLOG_INCLUDE_DIRS})

link_directories(${LIB_DIR})
add_executable(xeditd ${SRC_FILE})
target_include_directories(xeditd PUBLIC ${INC_DIR})
target_link_libraries(xeditd ${LIB})

错误

消息显示:

ICU_UC_CXXFLAGS_OTHER:
SPDLOG_CXXFLAGS_OTHER:
ICU_UC_LIBRARY_DIRS:/usr/local/Cellar/icu4c/64.2/lib
SPDLOG_LIBRARY_DIRS:
ICU_UC_LIBRARIES:icuucicudata
SPDLOG_LIBRARIES:
ICU_UC_INCLUDE_DIRS:/usr/local/Cellar/icu4c/64.2/include
SPDLOG_INCLUDE_DIRS:

头文件<spdlog/spdlog.h> 未找到。显然spdlog头目录不包含在cmake中。

问题

为什么 pkg_search_module 适用于icu4c,而错误不适用于spdlog?而不是pthread

【问题讨论】:

  • spdlog 通过find_package(spdlog REQUIRED)target_link_libraries(xeditd spdlog::spdlog) 成功链接。但我不知道它为什么起作用,有没有办法在macos上使用find_package for icu4c
  • "为什么 pkg_search_module 适用于 icu4c,但不适用于 spdlog?" - 可能是因为没有spdlog.pc 文件,pkg-config 需要该文件才能找到spdlog 包。最有可能的是,pkg_search_module(SPDLOG spdlog) 只是失败了。您没有检测到这一点,因为既没有使用 REQUIRED 关键字,也没有检查 SPDLOG_FOUND 变量。
  • 命令find_packagepkg_search_module不同 的包定位方式。这些命令使用不同的工具来实现它们的目的。 pkg_search_modulepkg-config 实用程序的包装器,它需要 XXX.pc 来定位包。 find_package 是一个纯 CMake 的东西。它要么使用FindXXX.cmake 模块,要么使用shipped with CMake 本身或由您的项目 提供,要么使用XXXConfig.cmakexxx-config.cmake 脚本,由搜索的包提供。

标签: c++ cmake pkg-config spdlog icu4c


【解决方案1】:
IF(APPLE)
    FIND_PACKAGE(spdlog REQUIRED)
ENDIF(APPLE)
...
# Translation is your traget
IF(APPLE)
    target_link_libraries(Translation PUBLIC spdlog::spdlog)
ENDIF(APPLE)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多