我正在为项目使用Code :: Blocks。多年来我没有在Linux上使用IDE,所以我对Linux IDE有点脱节。
我正在使用一个使用FIPS验证库的OpenSSL项目。我复制了GCC编译器工具链并将其修改为使用OpenSSL的fipsld
(并将其设置为默认值)。
当项目代码在Code :: Blocks via F8 下执行时,FIPS_mode_set
失败,错误252104805(0xF06D065)。 0xF06D065是:
$ openssl errstr 0xF06D065
error:0F06D065:common libcrypto routines:FIPS_mode_set:fips mode not supported
告诉我Code :: Blocks没有使用/usr/local/ssl/lib
中指定的OpenSSL。相反,该程序正在使用Debian在/usr/lib/x86_64-linux-gnu/
中提供的非FIPS库。
链接库设置的图像如下所示。请注意,库是完全指定的,没有任何遗憾。
CodeBlocks显然正在使用LD_LIBRARY_PATH
(如下所示)。
我还验证了该项目正在使用正确的搜索目录 - 标题为/usr/local/ssl/include
,链接为/usr/local/ssl/lib
。
将编译器日志记录设置为“完整命令行”设置,这是我从构建日志中获得的内容:
-------------- Build: Debug in ac ---------------
Compiling: main.cpp
/home/jwalton/Desktop/ac/main.cpp:8:5: warning: unused parameter ‘argc’ [-Wunused-parameter]
/home/jwalton/Desktop/ac/main.cpp:8:5: warning: unused parameter ‘argv’ [-Wunused-parameter]
Linking console executable: bin/Debug/ac
Output size is 569.67 KB
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 2 warnings
我知道Basile Starynkevitch对rpath
和LD_PRELOAD
技巧的建议,但这似乎是IDE应该为我处理的事情之一(Visual Studio会正确处理它,甚至给我们一个set Working Directories to find additional libraries)的输入框。
在调试器下执行程序时,如何使Code :: Blocks使用/usr/local/ssl/lib
中的共享对象?
答案 0 :(得分:3)
您的IDE指示编译器链接指定的库,但不能在运行时加载它们。对于后一种情况,您需要将另一个选项传递给链接器,即
-rpath=/path/to/directory/with/your/libraries
或者,如果编译器调用链接器,
-Wl,-rpath=/same/thing
答案 1 :(得分:1)
Code::Blocks不使用shared objects(DLL是Windows的事情)。因为Code::Blocks
只是IDE。 IDE荣耀source code editors,能够运行外部 software development tools。您可以(有时您应该,至少要了解事情如何发生)使用像emacs
之类的简单编辑器编辑代码,并使用命令构建它。您的IDE只是运行命令,特别是compiler和linker,可能使用gcc
那么在/usr/local/ssl/lib/
中使用共享对象的是编译器和链接器(以及运行时dynamic linker)。 BTW,/usr/local/ssl/lib/
是包含共享对象的目录的非常奇怪名称;您应该已将 OpenSSL 配置为安装在/usr/local/lib/
!
首先,我真的相信您应该重新配置并重新编译并重新构建并重新安装SSL,以便在/usr/local/
(或可能是/opt/
)前缀(即/usr/local/lib
中的共享库)下安装它
然后,您可以为ld
linker添加适当的选项(来自binutils
)。您可能需要-L/usr/local/ssl/lib
(运行gcc
的{{1}}命令),您可能想要传递ld
(请参阅this)。
我建议您在-Wl,-rpath
中重新安装SSL,将/usr/local/
添加到/usr/local/lib/
(或至少添加到LD_LIBRARY_PATH ...)并运行{{1} }
否则,请在/etc/ld.so.conf
(以及ldconfig
前面至少添加/usr/local/ssl/lib/
到您的链接命令。
阅读Program Library HowTo,this的答案以及 Drepper的How To Write Shared libraries论文。
答案 2 :(得分:0)
只需打开终端并输入
即可export LD_LIBRARY_PATH=/path/to/your/libraries
sudo ldconfig