在 GCC 中链接库

Posted

技术标签:

【中文标题】在 GCC 中链接库【英文标题】:Linking libraries in GCC 【发布时间】:2015-08-11 13:53:54 【问题描述】:

我正在尝试使用 makefile 在 ubuntu 中编译一些文件。 在网络上进行了几次搜索后,我在 makefile 中添加了以下几行。

run: hellocode.cpp    
    g++ -c hellocode.cpp -lssl -lcrypto

仍然在编译时创建目标文件,然后抛出此错误: 对“SSL_write”的未定义引用....

相反,如果删除'-c'并像这样使用它

run: hellocode.cpp         
    g++ hellocode.cpp -lssl -lcrypto

然后我没有看到之前的链接错误,但它显示了与 openssl 链接无关但与代码中的其他文件相关的不同错误。我已经在这个论坛上浏览了许多与此相关的问题,似乎没有一个对我有帮助。

请告诉我我的 makefile 是否错误,或者我的机器是否存在无法链接到我的库的问题。

【问题讨论】:

【参考方案1】:

这是一个您可以采用的简单 Makefile。请注意,编译和链接是两个步骤。如果需要,您可以使用 -I 获取其他包含路径,使用 -L 获取其他链接路径。

.PHONY : all 
all : hellocode

hellocode : hellocode.o 
    g++ -o hellocode hellocode.o -lssl -lcrypto

hellocode.o : hellocode.cpp
    g++ -c hellocode.cpp -o hellocode.o

如果有帮助,这里有一些basics of makefiles。

【讨论】:

感谢我相应地更改了我的 makefile 并且它有效:) :) GitHub 中有一个simple makefile example。【参考方案2】:

图书馆链接应该在最后阶段完成 - 链接:)

-c 表示“仅编译” - 它只是构建 .o 目标文件,没有任何参考解析(因此 -lXXX 在那里被忽略)。

-lXXX 选项应添加到最后一次调用gcc(不带-c),它会生成可执行文件,其中所有.o 文件都被收集起来以与库链接在一起以解析所有引用。

【讨论】:

以上是关于在 GCC 中链接库的主要内容,如果未能解决你的问题,请参考以下文章

gcc找不到静态库中的函数

GCC编译过程与动态链接库和静态链接库

在 GCC 中链接库

gcc:链接外部库

gcc 编译使用动态链接库和静态链接库

在 gcc Linux 中将静态库链接到动态库