38

我正在尝试在 MacOS X 上构建我们的一些软件,这些软件旨在仅在 Linux 上运行。我们正在使用 CMake,并且我安装了 MacPorts,因此我可以轻松获得 CMake 以及我们依赖的一些第三方库.

现在的问题是,默认情况下,CMake 似乎不会从 MacPorts 中查找库,因此我们的几个目标被禁用,因为它无法找到全部位于/opt/local中的依赖项。

我如何指示 CMake 也从 MacPorts 中查找包含和库?

4

5 回答 5

35

将 /opt/local/lib 和任何其他可能的安装路径添加到 cmake 在 CMakeLists.txt 文件中搜索的路径集:

set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} /opt/local/lib)

这会将 /opt/local/lib 附加到 cmake 搜索库的路径集。设置变量后,此CMAKE_LIBRARY_PATH技术将影响所有find_library命令。

对于更外科手术式的逐库方法,请修改各个 find_library 命令:

find_library(Foo foo
    PATHS /opt/local/lib)

请注意,这不会/opt/local/lib 硬编码为查找库的唯一位置。相反,它只是将 /opt/local/lib 附加到要搜索库的位置集。我经常最终添加许多这样的路径,涵盖在我所知道的所有机器上观察到的位置。有关此主题的更多变体,请参阅find_library 文档

您可能还希望更改CMAKE_INCLUDE_PATH,这会影响find_file()find_path()命令的行为。

于 2010-02-06T04:02:16.437 回答
16

我为“ Darwin ”添加了一个工具链文件,它添加了必要的包含和库路径。我希望有一些更自动化的东西,但至少它解决了问题。

darwin.cmake

SET(CMAKE_SYSTEM_NAME Darwin)

# Add MacPorts
INCLUDE_DIRECTORIES(/opt/local/include)
LINK_DIRECTORIES(/opt/local/lib)
于 2009-09-29T12:15:14.873 回答
6

CMake 需要尊重DYLD_LIBRARY_PATH环境变量,它相当于LD_LIBRARY_PATHLinux 上的环境变量。您DYLD_LIBRARY_PATH需要有正确的路径来查找 MacPorts 安装的库。

于 2009-09-28T15:50:56.303 回答
3

根据@Nerdling 对已接受解决方案的“不要硬编码”评论,这是检测 MacPorts 前缀路径的建议。

我的模块.cmake

# Detect if the "port" command is valid on this system; if so, return full path
EXECUTE_PROCESS(COMMAND which port RESULT_VARIABLE DETECT_MACPORTS OUTPUT_VARIABLE MACPORTS_PREFIX ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)

IF (${DETECT_MACPORTS} EQUAL 0)
    # "/opt/local/bin/port" doesn't have libs, so we get the parent directory
    GET_FILENAME_COMPONENT(MACPORTS_PREFIX ${MACPORTS_PREFIX} DIRECTORY)

    # "/opt/local/bin" doesn't have libs, so we get the parent directory
    GET_FILENAME_COMPONENT(MACPORTS_PREFIX ${MACPORTS_PREFIX} DIRECTORY)

    # "/opt/local" is where MacPorts lives, add `/lib` suffix and link
    LINK_DIRECTORIES(${LINK DIRECTORIES} ${MACPORTS_PREFIX}/lib)

    MESSAGE("WINNING!: ${MACPORTS_PREFIX}/lib")
ENDIF()

# Recommendation, also add a "brew --prefix" custom command to detect a homebrew build environment
于 2015-08-16T18:25:53.740 回答
1

安装cmakepkgconfig使用 MacPorts。

port install cmake pkgconfig

然后,使用 pkgconfig 查找库的 CMake 构建文件将使用 MacPorts 安装的 pkgconfig,当然它对于 MacPorts 安装的库具有正确的搜索路径。

假设 CMake 构建文件使用FindPkgConfig模块。例如,我FindLibuv.cmake在一个项目中有一个模块,它的开头是这样的。

find_package (PkgConfig)
pkg_check_modules (PC_Libuv QUIET libuv)
于 2019-10-15T13:41:16.090 回答