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

scyqe7ek  于 2022-11-11  发布在  Mac
关注(0)|答案(5)|浏览(185)

我正试图在MacOS X上构建我们的一些软件,这些软件是专为在Linux上运行而设计的。我们正在使用CMake,我安装了MacPorts,这样我就可以很容易地获得CMake沿着我们所依赖的一些第三方库。
现在的问题是,CMake在默认情况下似乎不会从MacPorts中查找库,因此我们的几个目标被禁用,因为它无法找到所有在 /opt/local 中的依赖项。
如何指示CMake也从MacPorts查找包含和库?

j8yoct9x

j8yoct9x1#

/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 documentation
您可能还希望更改CMAKE_INCLUDE_PATH,这会影响find_file()find_path()命令的行为。

jfgube3f

jfgube3f2#

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

  • 达尔文.cmake*:
SET(CMAKE_SYSTEM_NAME Darwin)

# Add MacPorts

INCLUDE_DIRECTORIES(/opt/local/include)
LINK_DIRECTORIES(/opt/local/lib)
rn0zuynd

rn0zuynd3#

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

lrl1mhuk

lrl1mhuk4#

根据@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
lnlaulya

lnlaulya5#

安装带有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)

相关问题