我继承了我正在尝试构建和运行的代码库。我以前能够这样做,但现在在不同的系统上我得到一些运行时错误,即使编译顺利。我对C很陌生,并希望有任何建议继续前进。
具体来说,我有一个常用实用程序的目录common
,它被内置到共享库中,当主程序尝试使用共享库中的符号时,我得到如下错误:
some_file.so: undefined symbol: CUSTOM_LOG_LEVEL
符号在头文件custom_log.h
中声明,如下所示:
extern int CUSTOM_LOG_LEVEL;
符号在custom_log.c
文件中定义,如下所示:
int CUSTOM_LOG_LEVEL = DEFAULT_CUSTOM_LOG_LEVEL;
这些记录器文件包含在其他常用实用程序的目录中,这些实用程序全部放在文件common.h
中。以下是记录器包含在公共库中的方式:
#include "custom_log.h"
运行configure,make和make install之后,lib目录的相关内容如下所示:
libsomething_common.so -> libsomething_common.so.0.0.0
libsomething_common.so.0 -> libsomething_common.so.0.0.0
libsomething_common.so.0.0.0
所以有一些符号链接的.so文件,他们最终指向的文件是libsomething_common.so.0.0.0
。使用objdump
命令分析文件会产生以下结果:
$ objdump -t libsomething_common.so.0.0.0 | grep CUSTOM_LOG_LEVEL
0000000000209a20 l O .data 0000000000000004 CUSTOM_LOG_LEVEL
$ objdump -T libsomething_common.so.0.0.0 | grep CUSTOM_LOG_LEVEL
所以我们可以看到符号不是动态的,我相信它应该是。但是如何实现呢?
同样,我对这个构建过程非常陌生,并感谢您提出的任何建议。