【问题标题】:Forcing compile time error for "undefined symbol" in scons强制 scons 中“未定义符号”的编译时错误
【发布时间】: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 作为参数。这就是后备计划。更好的方法是让链接器报告它并相应地失败。

标签: c scons


【解决方案1】:

这是我(OP)想出的答案: 添加

env.Append(LINKFLAGS=['-Wl,-z,defs'])

SConstruct

现在这个命令运行:

gcc -o lib/libmylib.so -Wl,-z,defs -shared build/mylib.o build/one.o build/two.o

输出此错误:

build/one.o: In function `somefunc':
/home/.../src/one.c:34: undefined reference to `someVar'

这对我有用。在接受这个答案之前,我会稍等片刻,看看是否有人提出了更好的技术或对此技术的改进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2016-11-18
    相关资源
    最近更新 更多