在 Linux/Unix 環境下使用 GCC/G++ 編譯 C/C++ 專案時,正確配置頭文件搜尋路徑與庫文件搜尋路徑是構建成功的關鍵。本文系統整理編譯選項與環境變量兩大配置方式。
# 單個目錄
gcc -I/usr/local/include/myLib main.c
# 多個目錄
g++ -I../include -I../../common/include -I/opt/boost/include main.cpp
# Makefile 中
CFLAGS += -I$(PROJECT_ROOT)/include
CXXFLAGS += -I$(PROJECT_ROOT)/include
優點:顯式、可移植、構建腳本中易維護、不污染環境。
| 變量名 | 適用語言 | 示例 |
|---|---|---|
| C_INCLUDE_PATH | C | export C_INCLUDE_PATH=/opt/mylib/include:$C_INCLUDE_PATH |
| CPLUS_INCLUDE_PATH | C++ | export CPLUS_INCLUDE_PATH=/opt/boost/include:$CPLUS_INCLUDE_PATH |
| OBJC_INCLUDE_PATH | Objective-C | export OBJC_INCLUDE_PATH=/opt/gnustep/include:$OBJC_INCLUDE_PATH |
| 階段 | 機制 | 配置方式 |
|---|---|---|
| 編譯/鏈接時 | 尋找 .so/.a 文件 | -L 或 LIBRARY_PATH |
| 程序運行時 | 動態鏈接器加載 .so | LD_LIBRARY_PATH / /etc/ld.so.conf / rpath |
gcc -Wl,-rpath,/opt/mysql/lib -L/opt/mysql/lib -lmysqlclient main.c
# 或 CMake: set(CMAKE_INSTALL_RPATH "/opt/mysql/lib")
export LD_LIBRARY_PATH=/opt/mysql/lib:$LD_LIBRARY_PATH
./myapp
echo "/opt/mysql/lib" >> /etc/ld.so.conf
ldconfig # 更新緩存
# 實際文件名 -l 參數
libm.so -lm
libpthread.a -lpthread
libmysqlclient.so -lmysqlclient
libboost_system.a -lboost_system
# 規則:去掉 "lib" 前綴 和 ".so/.a" 後綴
# 專案結構
myProject/
├── include/ # 頭文件
├── lib/ # 庫文件
├── src/
│ └── main.cpp
└── build/
# 編譯命令
cd build
g++ -I../include \
-L../lib \
-Wl,-rpath,../lib \
../src/main.cpp \
-lmybusiness -lmysqlclient -lpthread \
-o myapp
# 執行
./myapp
| 錯誤信息 | 原因 | 解決 |
|---|---|---|
| fatal error: xxx.h: No such file or directory | 頭文件路徑缺失 | 添加 -I 路徑 |
| undefined reference to `func' | 庫未鏈接或順序錯誤 | 添加 -lxxx,調整庫順序 (依賴者在前) |
| cannot find -lxxx | 庫文件目錄缺失 | 添加 -L 路徑 |
| error while loading shared libraries: libxxx.so | 運行時找不到動態庫 | 配置 rpath 或 LD_LIBRARY_PATH |
| 64位系統找不到庫 | 庫在 /usr/lib64 | 使用 -L/usr/lib64/mysql |
cmake_minimum_required(VERSION 3.10)
project(MyApp)
# 包含目錄
include_directories(${PROJECT_SOURCE_DIR}/include)
# 鏈接目錄
link_directories(${PROJECT_SOURCE_DIR}/lib)
# 目標
add_executable(myapp src/main.cpp)
target_link_libraries(myapp mybusiness mysqlclient pthread)
# 安裝時 rpath
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
-I 配置頭文件,-L 配置庫目錄,-l 指定庫名-Wl,-rpath 嵌入路徑,避免環境變量依賴/usr/lib64 或 /lib64掌握 GCC/G++ 的路徑配置機制,是 Linux 下 C/C++ 開發者的必備基本功。建議在專案中統一使用 CMake 等構建系統,將路徑配置聲明式化,避免手動維護編譯命令帶來的錯誤。