【发布时间】:2014-09-07 19:12:08
【问题描述】:
我遇到了一个问题,我在运行时收到此错误:“undefined symbol: someVar”。我想在链接时得到那个错误。
我想强制出现类似于此问题的链接错误: Easy check for unresolved symbols in shared libraries?
我正在使用 scons,所以我正在寻找一个特定于 scons 的答案。
我的 scons 规则如下所示:
def create_objs(SRCS):
return [env.Object(src) for src in SRCS]
object_mylib = ['mylib.c'
,'one.c'
,'two.c'
]
env.SharedLibrary('#/lib/mylib', create_objs(object_mylib))
我发现了在 scons 中添加链接器标志的问题: How do I add --whole-archive linker option in scons?
A) 在这两个问题之后,我最好的选择是为解决方案添加正确的标志吗?
B) 有没有更好的方法?
似乎有人怀疑我在运行时遇到了这个错误,所以我添加了这个细节: 我收到此错误:
could not load /somepath/libmylib.so for /somepath/libmylib.so: undefined symbol: someVar
关于此代码:
char *libFile = "/somepath/libmylib.so";
Handle = dlopen(libFile, RTLD_LAZY);
if (!Handle)
{
printf("could not load %s for %s", libFile, dlerror());
}
在运行时。
我的备份计划是编写一个执行 dlopen 的小程序并将其添加到 SConscript。
【问题讨论】:
-
你确定你是在 run-time 得到它而不是链接器错误吗?不,编译器无法检测到该错误,只有链接器可以做到。但是由于构建过程包括直接编译和链接,我看不到问题,因为你会(应该)在构建时得到错误,而不是在运行程序时。
-
我添加了细节来证明它是在运行时发生的。
-
如果您尝试使用
dlopen加载库,编译器(或链接器)如何知道它是否会失败? -
.so 链接后,我会在 SConscript 中调用我的小程序。小程序将退出,退出代码将指示成功或失败。那时 scons 将在失败时停止。小程序将采用任意 .so 作为参数。这就是后备计划。更好的方法是让链接器报告它并相应地失败。