2009-09-28 67 views
29

我試圖構建我們的一些軟件,它被設計爲在MacOS X上完全在Linux上運行。我們使用CMake並安裝了MacPorts,因此我可以輕鬆地獲得CMake以及一些第三方庫,我們取決於。如何指示CMake查找由MacPorts安裝的庫?

現在的問題是,它未能找到這些都是/選擇/本地依賴的CMake不會出現在默認情況下,尋找圖書館從MacPorts的所以我們幾個目標被禁用。

我該如何指導CMake同時從MacPorts中查找包含和庫?

+0

你有沒有考慮簡單地增加項目的回購MacPorts的?這樣所有正確的標誌都從MacPorts傳入。 – 2009-10-14 21:57:31

+2

這是一個專有的解決方案。 – 2009-11-10 12:08:02

回答

15

我添加了一個工具鏈文件「Darwin」,它添加了必要的包含和庫路徑。我希望有一些更自動化的東西,但至少可以解決問題。

darwin.cmake

SET(CMAKE_SYSTEM_NAME Darwin) 

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

不要硬編碼/ opt/local。這可以是用戶安裝MacPorts的任何目錄。 – 2009-10-14 21:56:44

+0

通常不是一個好主意。更好的方法是讓PATH執行需要包含的庫的查找,並專門添加庫名稱。那麼每個UNIX平臺都是不同的。 – Dave 2010-02-06 01:25:36

+1

我同意,但這不是最佳的解決方案,但它是我能想出的唯一工作解決方案。 – 2010-11-10 08:07:20

6

CMake需要尊重DYLD_LIBRARY_PATH環境變量,這相當於Linux上的LD_LIBRARY_PATH環境變量。您的DYLD_LIBRARY_PATH需要有正確的路徑來查找由MacPorts安裝的庫。

+1

LD_LIBRARY_PATH只能用於調試和測試。值得注意的是,如果你的可執行文件是setuid或setgid,它將被忽略。構建信息需要與項目文件中的其他構建信息一起使用。 – 2014-10-09 23:17:41

30

將/ opt/local/lib目錄,以及其他任何可能的安裝路徑,通過CMake的在你的CMakeLists.txt文件搜索的路徑集:

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

這將/ opt/local/lib附加到cmake搜索庫的路徑集。在設置變量後,此技巧將影響所有的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()命令的行爲。

+4

對於稍微好一些的語法:list(APPEND CMAKE_LIBRARY_PATH/opt/local/lib) – 2012-12-19 05:41:15

+0

您可能還想要'NO_DEFAULT_PATH'文件,因爲可能想從macports位置專門使用lib,但不搜索常規的。 – malat 2015-02-27 09:56:31

+1

這個答案浪費了我很多時間 - cmake似乎很高興忽略這個變量(或者它可能用於完全不同的目的)。只是想警告人們,因爲實際的(正確的)答案是(令人困惑地)較少讚揚的答案:使用'link_directories'。 – Marco 2015-08-12 00:11:34

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