2012-01-08 36 views
4

我有一個項目,我在Linux上運行(主要),但有時在Darwin/Mac OS X上運行。我使用CMake在Linux上生成Makefiles,在Mac OS X上生成Xcode項目。到目前爲止,這一切都運行良好。如何僅在Linux上使用Linux特有的API和庫使用CMake構建?

現在我想使用一些Linux特定功能(clock_gettime()和相關功能)。當我嘗試使用clock_gettime()時,我在Mac OS X上遇到鏈接器錯誤,所以我認爲它僅在Linux上可用。我準備在.c文件中引入條件編譯的代碼,以便在Linux上使用clock_gettime(),在Mac OS上使用普通的舊版clock()。 (順便說一下,我打算使用#include <unistd.h>#if _POSIX_TIMERS > 0作爲預處理器表達式,除非有人有更好的選擇。)

當涉及CMakeLists.txt文件時,事情會變得棘手。只有在跨平臺CMake項目的Linux構建下才將鏈接引入特定於Linux的API的首選方式是什麼?

注意:此問題的早期修訂包含對glibc的引用,該引用過於具體且令人困惑。這個問題實際上是在跨平臺CMake項目中使用特定於Linux的API和庫的正確方法。

+1

你的假設是錯誤的。 'clock_gettime'是POSIX的一部分,應該可以在任何現代的兼容操作系統上使用。 – 2012-01-08 03:54:49

+0

@R ..我試圖在Mac OS X上使用'clock_gettime()',並且出現鏈接器錯誤(相應地編輯了問題)。我錯過了什麼嗎? – 2012-01-08 05:23:34

+2

@R ..:它是POSIX擴展的一部分。 – 2012-01-08 05:26:18

回答

7

從你的例子抽象掉,並回答只有一個問題:

如何只使用Linux的Linux特有的API和庫建立與 CMake的?

CMake提供numerous useful constants,你可以爲了確定您正在運行的系統檢查:

if (${UNIX}) 
    # *nix-specific includes or actions 
elsif (${WIN32}) 
    # Windows-specific includes or actions 
elsif (${APPLE}) 
    # ... 
endif (${UNIX}) 
+0

謝謝,@sleepy。這與我所尋找的非常接近。我最終找到了一個解決方案,它是'if(UNIX AND NOT)... endif()'來推斷Linux作爲一個平臺。歡迎來到Stack Overflow! – 2012-01-11 18:50:36

5

(我知道你問glibc,但你真的想知道clock_gettime是否存在,對不對?但是沒有在你的問題是Linux特有的...)

如果你想檢查clock_gettime,你可以使用預處理器。如果存在clock_gettime,則將定義_POSIX_TIMERSclock_gettime函數是可選POSIX擴展(see spec)的一部分,因此它不是Linux特有的,但不是通用的。 Mac OS X沒有clock_gettime:它沒有在任何標題中聲明,也沒有在任何庫中定義。

#include <time.h> 
#include <unistd.h> /* for _POSIX_TIMERS definition, if present */ 

#if _POSIX_TIMERS 
...use clock_gettime()... 
#else 
...use something else... 
#endif 

這不解決,你仍然有-lrt在Linux上鍊接的問題。這通常是在Autoconf中用AC_CHECK_LIB之類的東西解決的,我確信在CMake中有一個等價的東西。

man 2 clock_gettime

在其上能夠提供以下功能POSIX系統中,符號_POSIX_TIMERS<unistd.h>被定義爲一個值大於0的符號_POSIX_MONOTONIC_CLOCK_POSIX_CPUTIME_POSIX_THREAD_CPUTIME表明CLOCK_MONOTONICCLOCK_PROCESS_CPUTIME_IDCLOCK_THREAD_CPUTIME_ID可用。 (另請參閱sysconf(3)。)

在達爾文上,如果需要高分辨率單調時鐘,則可以使用mach_absolute_time函數。如果你不需要分辨率或單調性,你應該在兩個平臺上都使用gettimeofday

+0

謝謝,Dietrich。我意識到這是我編輯我的問題,因爲glibc並不是問題的核心。 – 2012-01-08 05:54:45

+1

請注意,鏈接正確的庫也存在問題 - 'clock_gettime'需要'librt'在Linux上顯式鏈接。它可能還需要OS X上的某種庫,因此鏈接器錯誤。 – bdonlan 2012-01-08 06:03:18

+0

@bdonlan:是的,你說的是'-lrt'。但是,在OS X上沒有'clock_gettime'。 – 2012-01-08 06:49:28

相關問題