我正在尝试构建我们的一些软件,这些软件专门在Linux上运行,在MacOS X上运行。我们正在使用CMake并安装了MacPorts,因此我可以轻松地将CMake与一些第三方库一起使用我们依赖。
现在问题是,默认情况下,CMake似乎没有从MacPorts查找库,因此我们的一些目标被禁用,因为它无法找到所有依赖项,这些依赖项都在 / opt / local 中
我如何指示CMake也从MacPorts中寻找包含和库?
答案 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安装cmake
和pkgconfig
。
port install cmake pkgconfig
使用pkgconfig查找库的CMake构建文件将使用MacPorts安装的pkgconfig,并且当然具有MacPorts安装的库的正确搜索路径。
假定CMake构建文件使用FindPkgConfig模块。例如,我在项目中有一个FindLibuv.cmake
模块,它的开始就是这样。
find_package (PkgConfig)
pkg_check_modules (PC_Libuv QUIET libuv)