gcc和cmake和Makefile中指定头文件搜索路径、库文件搜索路径和链接库等参数

gcc和cmake和Makefile中指定头文件搜索路径、库文件搜索路径和链接库等参数

—— 2023-06-26 上海

code review!

1.gcc 参数 -I 和 -L 和 -l

gcc 的参数 -I-L-l 分别用于指定头文件搜索路径、库文件搜索路径和链接库。

    1. -I 参数用于指定头文件搜索路径。它后面需要跟随一个路径,指示编译器在该路径中搜索所需的头文件。例如,-I/path/to/header 将告诉编译器在 /path/to/header 目录中查找头文件。
    1. -L 参数用于指定库文件搜索路径。它后面需要跟随一个路径,指示编译器在该路径中搜索所需的库文件。例如,-L/path/to/libs 将告诉编译器在 /path/to/libs 目录中查找库文件。
    1. -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_DIRSMYLIB_LIBRARY_DIRSMYLIB_LIBRARIES),CMake 使用这些变量来配置项目。

  • 总结

    • GCC:组合使用 pkg-config 工具和 -I-L-l 选项来手动查找和配置库文件及其依赖项。
    • CMake 的 find_package:自动查找并配置库文件及其依赖项,简化了项目配置过程。

    find_package 在功能上更为综合和自动化,它不仅查找库,还配置所有必要的编译和链接信息,这使得 CMake 项目更易于维护和扩展。

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 更加灵活和强大,尤其是在处理复杂的项目依赖关系时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只野生的善逸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值