【发布时间】:2013-10-24 17:18:50
【问题描述】:
我正在使用 GNU g++ 编译 C++ 应用程序。该项目利用了 OpenSSL 库。
背景
在我的机器(64 位 CentOS 四核)上编译并链接我的文件。
g++ -g -c -L/usr/local/lib/ -L/usr/lib64/
-I/usr/local/include/ -I/usr/local/ssl/include/
-lcrypto mysrc1.cpp mysrc2.cpp mysrc3.cpp
g++ -L/usr/local/lib/ -L/usr/lib64/ -lcrypto
*.o -o ./myapp.out
我的应用程序使用函数MD5,它包含在libcrypto.so 中。如您所见,我向g++ 指定使用-L、-I 选项搜索的目录以及使用-l<lib-name> 选项查找哪些库。有一些像/usr/local/lib 这样的简单路径当然可以省略,但我指定了它们,因为makefile 是参数化的。
问题
我的问题是我可以成功编译我的东西(第一个命令),但链接失败(第二个命令):
/usr/bin/ld: 找不到-lcrypto
collect2: ld 返回 1 个退出状态
make: * [cppsims_par] 错误 1
但我确实检查了文件夹和所有内容...libcrypto.so 在 /usr/lib64/ 内。怎么回事?
【问题讨论】:
-
符号链接是否指向实际文件?
-
啊...我明白你的意思...去检查
-
我有两个文件:
/usr/lib64/libcrypto.so.10和/usr/lib64/libcrypto.so.1.0.0。在执行ls -l时,我可以看到符号链接的以下路径:/usr/lib64/libcrypto.so.10 -> libcrypto.so.1.0.0。最后一个是ls命令输出的摘录。 -
不回答您的问题,但请注意您希望以从多到少的依赖顺序链接您的目标代码和库。 (即您的 .o 使用 libcrypto,因此您的链接行应该带上 .o 的 first,然后是 -lcrypto)。一些链接器,特别是 gcc 的 ld,对此相当挑剔。但我也很好奇,为什么如果您的路径有效,
libcrypto无法定位。 -
您可以尝试的一件事是将
-v添加到您的 gcc 行。它相当嘈杂,但它应该显示为需要路径的操作搜索的 all 路径,包括包含路径和链接器路径。 编辑,从你的文件编译行中取出 -lcrypto。编译但不链接您的mysrc*.cpp文件的行。这不是一个链接步骤,它是一个仅编译的步骤,不应该存在。它应该只在你的 last 行。同样,该行也不需要 lib 路径。
标签: c++ linux linker g++ shared-libraries