如何指示CMake查找MacPorts安装的库?

时间:2009-09-28 15:37:21

标签: macos cmake macports

我正在尝试构建我们的一些软件,这些软件专门在Linux上运行,在MacOS X上运行。我们正在使用CMake并安装了MacPorts,因此我可以轻松地将CMake与一些第三方库一起使用我们依赖。

现在问题是,默认情况下,CMake似乎没有从MacPorts查找库,因此我们的一些目标被禁用,因为它无法找到所有依赖项,这些依赖项都在 / opt / local

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

5 个答案:

答案 0 :(得分:32)

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

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)

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

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

答案 1 :(得分:15)

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

darwin.cmake

SET(CMAKE_SYSTEM_NAME Darwin)

# Add MacPorts
INCLUDE_DIRECTORIES(/opt/local/include)
LINK_DIRECTORIES(/opt/local/lib)

答案 2 :(得分:6)

CMake需要尊重DYLD_LIBRARY_PATH环境变量,它等同于Linux上的LD_LIBRARY_PATH环境变量。您的DYLD_LIBRARY_PATH需要有正确的途径来查找MacPorts安装的库。

答案 3 :(得分:2)

Per @ Nerdling' "请勿对已接受的解决方案进行硬编码" 评论,此处是检测MacPorts前缀路径的提案。

MyModule.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

答案 4 :(得分:1)

使用MacPorts安装cmakepkgconfig

port install cmake pkgconfig

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

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

find_package (PkgConfig)
pkg_check_modules (PC_Libuv QUIET libuv)