C 用代码::块克服DLL地狱

C 用代码::块克服DLL地狱,c,linux,dll,shared-libraries,codeblocks,C,Linux,Dll,Shared Libraries,Codeblocks,我正在为一个项目使用Code::Blocks。我已经好几年没有在Linux上使用IDE了,所以我对Linux IDE有点不熟悉 我正在处理一个使用FIPS验证库的OpenSSL项目。我复制了GCC编译器工具链,并将其修改为使用OpenSSL的fipsld(并将其设置为默认值) 当项目代码通过F8在code::Blocks下执行时,FIPS\u mode\u set失败,错误为252104805(0xF06D065)。0xF06D065是: $ openssl errstr 0xF06D065 e

我正在为一个项目使用Code::Blocks。我已经好几年没有在Linux上使用IDE了,所以我对Linux IDE有点不熟悉

我正在处理一个使用FIPS验证库的OpenSSL项目。我复制了GCC编译器工具链,并将其修改为使用OpenSSL的
fipsld
(并将其设置为默认值)

当项目代码通过F8在code::Blocks下执行时,
FIPS\u mode\u 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\u LIBRARY\u 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将正确处理它,甚至为我们提供一个输入框)

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

不要使用(是Windows的东西)。因为
code::Blocks
只是一个简单的函数。IDE因能够运行外部系统而备受推崇。您可以(有时您应该,至少为了了解事情是如何发生的)使用一个简单的编辑器(如
emacs
)编辑代码,并使用命令构建代码。您的IDE只是运行命令,特别是a和a,可能使用的是
gcc

因此,在
/usr/local/ssl/lib/
中使用共享对象的是编译器和链接器(以及运行时)。顺便说一句,
/usr/local/ssl/lib/
对于包含共享对象的目录来说是一个非常奇怪的名称;您应该已经将OpenSSL配置为安装在
/usr/local/lib/

首先,我真的认为您应该重新配置、重新编译、重建和重新安装SSL,以便将其安装在
/usr/local/
(或者
/opt/
)前缀(即
/usr/local/lib
中的共享库)下

然后可以为添加适当的选项(从
binutils
)。您可能需要
-L/usr/local/ssl/lib
(到运行
ld
gcc
命令),并且您可能需要传递
-Wl,-rpath
(请参阅)

我建议您在
/usr/local/
中重新安装SSL,将
/usr/local/lib/
添加到
/etc/ld.so.conf
(或至少添加到您的…)中,然后运行
ldconfig

否则,在
LD\u LIBRARY\u路径前面至少添加
/usr/local/ssl/lib/
(以及
-L/usr/local/ssl/lib/
到链接命令)


阅读、回答和Drepper的论文

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

-rpath=/path/to/directory/with/your/libraries
或者,如果编译器调用了链接器

-Wl,-rpath=/same/thing

只需打开终端并键入

export LD\u LIBRARY\u PATH=/PATH/to/your/libraries
sudoldconfig

请发布来自代码块的完整构建日志。为此设置“显示完整命令行”选项:Alex-Thank,added.Thnaks-Basile。“…用一个简单好的编辑器(比如emacs)编辑你的代码,并用命令构建它”——这通常是我在Linux上所做的,因为IDE在过去遇到了很多麻烦(VisualStudio非常好,很难接受更少)。我甚至在Linux上手工编写makefiles。我本来希望IDE的自动完成功能能够加快开发速度,因为我不喜欢用OpenSSL源文件作为函数名。不,IDE正在减慢开发速度,因为它们隐藏了一些东西。也许您想要或
etag
(使用
emacs
)?再次感谢Basile。“您应该已将OpenSSL配置为安装在
/usr/local/lib/
”—在使用OpenSSL FIPS对象模块时,必须小心这样做。如果其中一个偏离程序,则验证无效。在
config
期间设置目录将是一种违规行为。然后使用我在回答中提到的
LD\u LIBRARY\u PATH
-Wl,-rpath
技巧(如果合适,请接受)。谢谢n.m.我通过F8在code::Blocks下运行此功能。所以代码::块不处理事情,所以它们“只工作”像VisualStudio?很抱歉问你。我已经好几年没有在Linux IDE中工作了。它不是Code::Blocks vs Visual Studio。这是Unix对Windows。它们不一样。学习他们,爱他们。