【问题标题】:I want to know what happened when I use the command "g++ -o main main.o -L<directory> -l<lib_name>"我想知道当我使用命令“g++ -o main main.o -L<directory> -l<lib_name>”时发生了什么
【发布时间】:2019-04-26 10:49:09
【问题描述】:

假设我在当前目录中有 ma​​in.c main.o libheymath.so。我想将它们链接在一起以生成一个可执行文件。我使用命令 "g++ -o main main.o -L./ -lheymath" 来实现这一点。但是不知道为什么要注明库目录和名称。据我所知,当我运行 "./main" 时,系统会将共享库加载到特定目录的内存中,例如 /lib/use /lib 和在 LD_LIBRARY_PATH 等中指定的目录,但不是我所指出的。那么“-L./ -lheymath”的目的是什么?

工作目录文件:

main.c、main.o、libheymath.so

命令:

g++ -o main main.o -L./ -lheymath

./main

【问题讨论】:

    标签: linker g++ linker-flags


    【解决方案1】:

    -L 允许指示在链接时查找库的路径(它不会“保存”在生成的可执行文件中以便在您启动可执行文件时重复使用)

    -l 表示您要链接的库,这允许检查是否缺少某些符号,并在您启动可执行文件时知道要加载的库列表。

    当您链接这些库时,这些库的路径不会保存到可执行文件中,因为可执行文件和库都可以在链接之后移动(并且可能安装在其他主机上)

    注意LD_LIBRARY_PATH 用于启动可执行文件以查找动态库,而不用于链接对象/库以生成可执行文件

    【讨论】:

    • 除了检查符号,还有什么要检查的吗?
    • @009 如果我没记错的话,不,除了可能管理要生成/保留的模板定义,但这并不是真正的“链接”步骤。请注意,与方法关联的符号名称还包含方法的配置文件(返回类型和 args 类型)
    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2019-11-27
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多