gcc和cmake和Makefile中指定头文件搜索路径、库文件搜索路径和链接库等参数
—— 2023-06-26 上海
code review!
文章目录
1.gcc 参数 -I 和 -L 和 -l
gcc 的参数 -I
、-L
和 -l
分别用于指定头文件搜索路径、库文件搜索路径和链接库。
-
-I
参数用于指定头文件搜索路径
。它后面需要跟随一个路径,指示编译器在该路径中搜索所需的头文件。例如,-I/path/to/header
将告诉编译器在/path/to/header
目录中查找头文件。
-
-L
参数用于指定库文件搜索路径
。它后面需要跟随一个路径,指示编译器在该路径中搜索所需的库文件。例如,-L/path/to/libs
将告诉编译器在/path/to/libs
目录中查找库文件。
-
-l
参数用于指定需要链接的库文件
。它后面需要跟随库文件名,不需要包含文件扩展名(如.lib
或.a
)。编译器会在指定的库文件搜索路径中查找并链接指定的库文件。例如,-lmylib
将链接名为libmylib
的库文件。
需要注意的是,使用 -I
、-L
和 -l
参数时,路径和文件名是相对于当前工作目录或默认搜索路径的。如果文件或库不在默认搜索路径中,可以使用完整的绝对路径或者结合这些参数来指定自定义的搜索路径。
例如,gcc -I/path/to/headers -L/path/to/libs -lmylib main.c
将指定头文件搜索路径为 /path/to/headers
,库文件搜索路径为 /path/to/libs
,并链接名为 libmylib
的库文件,最后编译并链接 main.c
文件生成可执行文件。
2.gcc 参数 -I 和 -L 和 -l对应的CMakeLists.txt
在 CMake 中,可以使用相应的命令和变量来设置与 gcc 参数 -I
、-L
和 -l
相关的选项。
以下是 CMake 中的对应设置:
-
-I
对应的是 CMake 的include_directories
命令。它用于指定头文件搜索路径。示例:include_directories(/path/to/headers)
-
-L
对应的是 CMake 的link_directories
命令。它用于指定库文件搜索路径。示例:link_directories(/path/to/libs)
-
-l
对应的是 CMake 的target_link_libraries
命令。它用于链接库文件。示例:target_link_libraries(my_target_name mylib)
这里的
my_target_name
是目标可执行文件或库的名称,而mylib
是要链接的库文件名,不包括扩展名。
下面是一个示例的 CMakeLists.txt 文件,展示了如何使用上述命令和变量:
cmake_minimum_required(VERSION 3.0)
project(my_project)
# 设置头文件搜索路径
include_directories(/path/to/headers)
# 设置库文件搜索路径
link_directories(/path/to/libs)
# 添加可执行文件或库
add_executable(my_executable main.c)
# 链接库文件
target_link_libraries(my_executable mylib)
在这个示例中,main.c
是源文件,mylib
是要链接的库文件名(不包括扩展名),my_executable
是生成的可执行文件名。
通过编写类似上述的 CMakeLists.txt 文件,并使用 CMake 构建过程,可以实现与 gcc 参数 -I
、-L
和 -l
相关的设置和操作。
3.gcc 参数 -I 和 -L 和 -l对应的Makefile
在 Makefile 中,可以使用变量和规则来设置与 gcc 参数 -I
、-L
和 -l
相关的选项。
以下是 Makefile 中的对应设置:
-
-I
对应的是 Makefile 中的CFLAGS
变量。它用于指定编译选项,包括头文件搜索路径。示例:CFLAGS += -I/path/to/headers
-
-L
对应的是 Makefile 中的LDFLAGS
变量。它用于指定链接选项,包括库文件搜索路径。示例:LDFLAGS += -L/path/to/libs
-
-l
对应的是 Makefile 中的LDLIBS
变量。它用于指定要链接的库文件。示例:LDLIBS += -lmylib
这里的
mylib
是要链接的库文件名,不包括扩展名。
下面是一个示例的 Makefile,展示了如何使用上述变量和规则:
CC = gcc
CFLAGS = -I/path/to/headers
LDFLAGS = -L/path/to/libs
LDLIBS = -lmylib
my_executable: main.o
$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
main.o: main.c
$(CC) $(CFLAGS) -c $< -o $@
在这个示例中,main.c
是源文件,mylib
是要链接的库文件名(不包括扩展名),my_executable
是生成的可执行文件名。
通过编写类似上述的 Makefile 文件,使用变量和规则进行设置和操作,可以实现与 gcc 参数 -I
、-L
和 -l
相关的功能。
4.2024-07-01补充笔记:CMake中的find_package在功能上类似于 GCC 编译器命令中的什么?
find_package
在 CMake 中的功能没有直接的 GCC 编译器选项对应,但它的作用可以部分类比于组合使用的一系列 GCC 选项和外部工具。在实际操作中,find_package
的功能更为高级和综合。
-
find_package
的功能find_package
用于在系统中查找已经安装的库或包,并配置相应的头文件路径、库文件路径和其他必要的信息,使得这些库或包能够被当前的 CMake 项目使用。它可以查找并引入外部依赖,并自动设置编译和链接所需的所有路径。 -
类比
虽然没有单个 GCC 编译器选项与
find_package
完全对应,但可以将其类比为组合使用的以下选项和操作:pkg-config
工具:在许多情况下,pkg-config
可以查找库并提供编译和链接所需的标志。例如:
pkg-config --cflags --libs mylib
这条命令会返回
-I
标志(用于包含路径)和-L
、-l
标志(用于库路径和库名)。- GCC 的
-I
、-L
和-l
选项:这些选项分别指定头文件目录、库文件目录和链接库。例如:
gcc -I/path/to/includes -L/path/to/libs -o myprogram myprogram.c -lmylib
-
实际应用CMake 示例
# 指定 CMake 最低版本 cmake_minimum_required(VERSION 3.12) # 项目名称 project(MyProject) # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 17) # 查找包 find_package(MyLib REQUIRED) # 包含头文件目录 include_directories(${MYLIB_INCLUDE_DIRS}) # 链接库文件目录 link_directories(${MYLIB_LIBRARY_DIRS}) # 添加可执行文件 add_executable(myprogram "myprogram.cpp") # 链接库 target_link_libraries(myprogram ${MYLIB_LIBRARIES})
在这个示例中,
find_package
查找MyLib
包并设置相应的变量(如MYLIB_INCLUDE_DIRS
、MYLIB_LIBRARY_DIRS
和MYLIB_LIBRARIES
),CMake 使用这些变量来配置项目。 -
总结
- GCC:组合使用
pkg-config
工具和-I
、-L
、-l
选项来手动查找和配置库文件及其依赖项。 - CMake 的
find_package
:自动查找并配置库文件及其依赖项,简化了项目配置过程。
find_package
在功能上更为综合和自动化,它不仅查找库,还配置所有必要的编译和链接信息,这使得 CMake 项目更易于维护和扩展。 - GCC:组合使用
5.2024-07-01补充笔记:CMake中的CMAKE_PREFIX_PATH在功能上类似于 GCC 编译器命令中的什么?
CMAKE_PREFIX_PATH
在功能上类似于 GCC 编译器命令中的 -I
和 -L
选项,但它们的实际用途和意义有所不同。
-
GCC 命令中的
-I
和-L
-I<dir>
:指定头文件搜索路径。GCC 在编译时会在这些目录中查找头文件。-L<dir>
:指定库文件搜索路径。GCC 在链接时会在这些目录中查找库文件。
示例:
gcc -I/path/to/includes -L/path/to/libs -o myprogram myprogram.c -lmylib
-
CMake 中的
CMAKE_PREFIX_PATH
CMAKE_PREFIX_PATH
是一个更高层次的配置选项,用于指定 CMake 查找外部包(如通过 find_package
命令查找)的前缀路径。它不仅可以用于查找头文件和库文件,还可以用于查找包配置文件(如 Find<Package>.cmake
或 <Package>Config.cmake
文件)。
- 类比
如果要类比 GCC 和 CMake 的用法,CMAKE_PREFIX_PATH
可以理解为一个综合选项,它同时包含了头文件和库文件的搜索路径,但它的主要作用是帮助 CMake 查找包配置文件。
-
实际应用示例
-
GCC 示例
假设你有一个使用自定义路径安装的库,你需要告诉 GCC 去哪里查找头文件和库文件:
gcc -I/custom/path/include -L/custom/path/lib -o myprogram myprogram.c -lmylib
-
CMake 示例
相同的场景下,你使用 CMake 来管理编译和链接:# 指定 CMake 最低版本 cmake_minimum_required(VERSION 3.12) # 项目名称 project(MyProject) # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 17) # 设置 CMAKE_PREFIX_PATH 以找到自定义路径中的库 set(CMAKE_PREFIX_PATH "/custom/path") # 查找包 find_package(MyLib REQUIRED) # 包含头文件目录 include_directories(${MYLIB_INCLUDE_DIRS}) # 链接库 link_directories(${MYLIB_LIBRARY_DIRS}) # 添加可执行文件 add_executable(myprogram "myprogram.cpp") # 链接库 target_link_libraries(myprogram ${MYLIB_LIBRARIES})
在这个例子中,
CMAKE_PREFIX_PATH
包含了/custom/path
,CMake 会在/custom/path
下查找包配置文件、头文件和库文件。
-
-
总结
- GCC 的
-I
和-L
:用于直接指定头文件和库文件的搜索路径。 - CMake 的
CMAKE_PREFIX_PATH
:用于指定 CMake 查找包配置文件的前缀路径,从而间接找到头文件和库文件。
通过设置
CMAKE_PREFIX_PATH
,你可以让 CMake 在指定的目录中查找各种依赖项,而不仅仅是头文件和库文件。这使得 CMake 更加灵活和强大,尤其是在处理复杂的项目依赖关系时。 - GCC 的