用Code :: Blocks克服DLL Hell

时间:2014-01-05 09:21:54

标签: c linux dll shared-libraries codeblocks

我正在为项目使用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库。

链接库设置的图像如下所示。请注意,库是完全指定的,没有任何遗憾。

Code::Blocks link library settings

CodeBlocks显然正在使用LD_LIBRARY_PATH(如下所示)。

LD_LIBRARY_PATH settings

我还验证了该项目正在使用正确的搜索目录 - 标题为/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对rpathLD_PRELOAD技巧的建议,但这似乎是IDE应该为我处理的事情之一(Visual Studio会正确处理它,甚至给我们一个set Working Directories to find additional libraries)的输入框。

在调试器下执行程序时,如何使Code :: Blocks使用/usr/local/ssl/lib中的共享对象?

3 个答案:

答案 0 :(得分:3)

您的IDE指示编译器链接指定的库,但不能在运行时加载它们。对于后一种情况,您需要将另一个选项传递给链接器,即

-rpath=/path/to/directory/with/your/libraries

或者,如果编译器调用链接器,

-Wl,-rpath=/same/thing

答案 1 :(得分:1)

Code::Blocks不使用shared objectsDLL是Windows的事情)。因为Code::Blocks只是IDE。 IDE荣耀source code editors,能够运行外部 software development tools。您可以(有时您应该,至少要了解事情如何发生)使用像emacs之类的简单编辑器编辑代码,并使用命令构建它。您的IDE只是运行命令,特别是compilerlinker,可能使用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 HowTothis的答案以及 Drepper的How To Write Shared libraries论文

答案 2 :(得分:0)

只需打开终端并输入

即可
export LD_LIBRARY_PATH=/path/to/your/libraries 
sudo ldconfig
相关问题