【发布时间】:2019-05-16 10:22:19
【问题描述】:
我正在尝试使用以下命令构建我的可执行文件(取决于库 utils.so)
g++ -L/path/to/libutils -lutils -I/path/to/utils_headers executable.cpp -o executable
实际上我没有 utils.so - 只有 utils 库的头文件。
我收到了错误:
ld: cannot find -lutils
链接器是否真的需要访问我的可执行文件所依赖的所有库才能构建我的可执行文件?如果是,那么我想知道它为什么需要访问它们。
我的可执行文件是一个共享库。我确信 utils lib 的头文件足以构建它(即没有 utils.so)。
【问题讨论】:
-
我没有运行它——我只是在构建它。可能有未解析的符号,对吧?
-
“拥有所有符号”是什么意思?我有所有的符号——它们在头文件中声明。这足以编译源文件并将目标文件放入可执行文件中。
-
那你为什么要加
-lutils?如果所有符号都在标头中,则无需链接库。但如果它们不是,那么你需要链接它。 -
@πάνταῥεῖ 我认为关键是
utils是一个共享库,只有在需要它的可执行文件运行时才需要它。严格来说,编译只需要头文件中的信息,所以这种行为看起来就像一个额外的安全检查。 -
@Alexey “选项 -utils 会导致链接器做什么?它真的会出于某种原因访问这个库吗?” 除了选项应该是
-lutils它将尝试在您使用-L选项指定的路径中查找名为libutils.a的库。甚至运行时链接库也需要作为存根链接。