GSL (GNU Scientific Library) 提供豐富的數學常數、特殊函數、隨機數產生器、線性代數、統計、插值、傅立葉轉換等功能,是科學計算程式的標準依賴。本文示範一般用戶無 root 權限時,以 --prefix 指定安裝至家目錄 (如 ~/opt/gsl-2.7),並配置環境變數與編譯連結參數,最後以貝氏函數測試驗證。
cd ~
wget https://ftp.gnu.org/gnu/gsl/gsl-latest.tar.gz
tar zxvf gsl-latest.tar.gz
cd gsl-2.7 # 實際版本號依檔名而定
./configure --prefix=$HOME/opt/gsl-2.7
make -j$(nproc)
make install
--prefix 指定安裝根目錄,下方將建立 bin/、include/、lib/、share/-j$(nproc) 並行編譯加速編輯 ~/.bashrc (或 ~/.zshrc) 尾端加入:
# GSL 環境變數
export PATH=$PATH:$HOME/opt/gsl-2.7/bin
export C_INCLUDE_PATH=$C_INCLUDE_PATH:$HOME/opt/gsl-2.7/include
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/opt/gsl-2.7/lib
export GSL_LD=$HOME/opt/gsl-2.7/lib # 方便連結時 -L$GSL_LD
執行 source ~/.bashrc 立即生效。
test_bessel.c#include
#include
int main(void) {
double x = 5.0;
double y = gsl_sf_bessel_J0(x);
printf("J0(%g) = %.18e\n", x, y);
return 0;
}
gcc -c test_bessel.c -I$HOME/opt/gsl-2.7/include -o test_bessel.o
gcc test_bessel.o -o test_bessel -L$GSL_LD -lgsl -lgslcblas -lm
./test_bessel
gcc test_bessel.c -o test_bessel -I$HOME/opt/gsl-2.7/include -L$GSL_LD -lgsl -lgslcblas -lm
gcc test_bessel.c -o test_bessel_static -I$HOME/opt/gsl-2.7/include -L$GSL_LD -lgsl -lgslcblas -lm -static
輸出範例:J0(5) = -1.775967713143382642e-01 即代表安裝成功。
| 問題 | 解決 |
|---|---|
| fatal error: gsl/gsl_math.h: No such file or directory | 缺少 -I$HOME/opt/gsl-2.7/include |
| /usr/bin/ld: cannot find -lgsl | 缺少 -L$GSL_LD 或 LD_LIBRARY_PATH 未設定 |
| error while loading shared libraries: libgsl.so.27 | 執行時找不到 .so,需 export LD_LIBRARY_PATH=$HOME/opt/gsl-2.7/lib:$LD_LIBRARY_PATH |
| 想升級版本 | 重新下載新版原始碼,指定不同 --prefix (如 gsl-2.8),修改環境變數指向新路徑即可並存 |
# CMakeLists.txt 片段
find_path(GSL_INCLUDE_DIR gsl/gsl_math.h PATHS $ENV{HOME}/opt/gsl-2.7/include)
find_library(GSL_LIBRARY gsl PATHS $ENV{HOME}/opt/gsl-2.7/lib)
find_library(GSL_CBLAS_LIBRARY gslcblas PATHS $ENV{HOME}/opt/gsl-2.7/lib)
if(GSL_INCLUDE_DIR AND GSL_LIBRARY AND GSL_CBLAS_LIBRARY)
include_directories(${GSL_INCLUDE_DIR})
target_link_libraries(your_target ${GSL_LIBRARY} ${GSL_CBLAS_LIBRARY} m)
else()
message(FATAL_ERROR "GSL not found in ~/opt/gsl-2.7")
endif()