我试图建立一些我们的软件,其目的是在Linux上运行完全,MacOS X上,我们正在使用的CMake和我的MacPorts安装,所以我可以很容易地与一些我们依赖于第三方库的相处的CMake 。
现在的问题是,CMake的没有出现在默认情况下,寻找图书馆从MacPorts的所以我们几个指标被禁用,因为它无法找到这些都是在/ opt /本地的依赖关系。
我怎么能指示的CMake也找包括从MacPorts的库?
我试图建立一些我们的软件,其目的是在Linux上运行完全,MacOS X上,我们正在使用的CMake和我的MacPorts安装,所以我可以很容易地与一些我们依赖于第三方库的相处的CMake 。
现在的问题是,CMake的没有出现在默认情况下,寻找图书馆从MacPorts的所以我们几个指标被禁用,因为它无法找到这些都是在/ opt /本地的依赖关系。
我怎么能指示的CMake也找包括从MacPorts的库?
将/ 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()
命令。
我加了一个工具链文件“ 达尔文 ”,这增加了必要的包括和库路径。 我希望的东西多一点自动化,但至少它解决了这个问题。
darwin.cmake:
SET(CMAKE_SYSTEM_NAME Darwin)
# Add MacPorts
INCLUDE_DIRECTORIES(/opt/local/include)
LINK_DIRECTORIES(/opt/local/lib)
CMake的需要尊重DYLD_LIBRARY_PATH
环境变量,这是相当于LD_LIBRARY_PATH
在Linux环境变量。 你DYLD_LIBRARY_PATH
需要有找到的MacPorts安装的存储库的正确路径。
每@ 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