无法将 sndfile 库链接到 cmake 项目(MacOS)

Posted

技术标签:

【中文标题】无法将 sndfile 库链接到 cmake 项目(MacOS)【英文标题】:Cannot link sndfile library to cmake project (MacOS) 【发布时间】:2021-04-23 21:53:16 【问题描述】:

目前我正在尝试为我的 uni 项目生成一些频谱图。我正在尝试构建一个静态库,所有魔法都可以在其中发挥作用,只需从 main() 函数调用它。

这是我的 cmake 文件:

set(CMAKE_CXX_STANDARD 17)
project(demo)


find_package(SndFile REQUIRED)

add_subdirectory(spectogram)
add_executable(demo main.cpp)
target_link_libraries (demo LINK_PUBLIC Spectrogram)
target_link_libraries(demo PRIVATE SndFile::sndfile)

我已经通过 homebrew 安装了 libsndfile,但是 find_package() 拒绝定位 lib 并抛出此错误:

CMake Error at CMakeLists.txt:6 (find_package):
  By not providing "FindSndFile.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "SndFile", but
  CMake did not find one.

  Could not find a package configuration file provided by "SndFile" with any
  of the following names:

    SndFileConfig.cmake
    sndfile-config.cmake

  Add the installation prefix of "SndFile" to CMAKE_PREFIX_PATH or set
  "SndFile_DIR" to a directory containing one of the above files.  If
  "SndFile" provides a separate development package or SDK, be sure it has
  been installed.


-- Configuring incomplete, errors occurred!

我做了一些研究,发现 libsndfile 内部没有任何 .cmake 配置,就像其他库一样,我可以轻松链接(如 OpenCV 或 spdlog)。我非常感谢任何帮助解决这个恐怖问题。

【问题讨论】:

看起来sndfile project 为sndfile.pc 提供了一个文件sndfile.pc,因此您可以为该项目使用CMake 模块PkgConfig。请参阅that question 了解如何使用该 CMake 模块。 谢谢,@Tsyvarev,看起来 pkg-config 确实有帮助。它找到了包,但不知何故找不到 sndfile.hh 文件,所以我检查了 LIBSNDFILE_LIBRARIES 和 LIBSNDFILE_INCLUDE_DIRS 变量,它们是空的。我找到了FindLibSndFile.cmake 并将其包含在我的 cmake 文件中并且它有效! 【参考方案1】:

在 Tsyvarev 的帮助下,我找到了解决方案。我使用了 pkg-config 模块和自定义的cmake file,我在网上找到了。我将包含我的最终 cmake,以防其他人需要它:

cmake_minimum_required(VERSION 3.17)
set(CMAKE_CXX_STANDARD 17)
project(demo)


# - Try to find libsndfile
# Once done, this will define
#
#  LIBSNDFILE_FOUND - system has libsndfile
#  LIBSNDFILE_INCLUDE_DIRS - the libsndfile include directories
#  LIBSNDFILE_LIBRARIES - link these to use libsndfile

# Use pkg-config to get hints about paths
find_package(PkgConfig QUIET)
if(PKG_CONFIG_FOUND)
    pkg_check_modules(LIBSNDFILE_PKGCONF sndfile)
endif(PKG_CONFIG_FOUND)

# Include dir
find_path(LIBSNDFILE_INCLUDE_DIR
        NAMES sndfile.h
        PATHS $LIBSNDFILE_PKGCONF_INCLUDE_DIRS
        )

# Library
find_library(LIBSNDFILE_LIBRARY
        NAMES sndfile libsndfile-1
        PATHS $LIBSNDFILE_PKGCONF_LIBRARY_DIRS
        )

find_package(PackageHandleStandardArgs)
find_package_handle_standard_args(LibSndFile  DEFAULT_MSG  LIBSNDFILE_LIBRARY LIBSNDFILE_INCLUDE_DIR)

if(LIBSNDFILE_FOUND)
    set(LIBSNDFILE_LIBRARIES $LIBSNDFILE_LIBRARY)
    set(LIBSNDFILE_INCLUDE_DIRS $LIBSNDFILE_INCLUDE_DIR)
endif(LIBSNDFILE_FOUND)

mark_as_advanced(LIBSNDFILE_LIBRARY LIBSNDFILE_LIBRARIES LIBSNDFILE_INCLUDE_DIR LIBSNDFILE_INCLUDE_DIRS)

include(FindPkgConfig)
pkg_search_module(SndFile REQUIRED sndfile)

include_directories($LIBSNDFILE_INCLUDE_DIRS)

add_subdirectory(spectogram)
add_executable(demo main.cpp)

message(STATUS "sndfile include dirs path: $LIBSNDFILE_INCLUDE_DIRS")
message(STATUS "sndfile libs path: $LIBSNDFILE_LIBRARIES")

target_link_libraries (demo LINK_PUBLIC Spectrogram)
target_link_libraries(demo PRIVATE $LIBSNDFILE_LIBRARIES)

【讨论】:

以上是关于无法将 sndfile 库链接到 cmake 项目(MacOS)的主要内容,如果未能解决你的问题,请参考以下文章

CMake:将第三方库链接到项目库

如何将 TensorFlow Lite 构建为静态库并从单独的(CMake)项目链接到它?

将 libpqxx 库添加到 cmake

是否可以将 cmake 项目链接到子项目?

CMAKE将动态库链接到模块,但不显示为链接依赖

CMake 访问 SWIG 并将 java 库链接到现有 C++ 项目的问题