在Solaris 10下,我正在创建一个库A.so,它调用在库B.so中定义的函数f()。要编译库A.so,我在我的代码f()中声明为extern。
不幸的是,我“忘记”在A的makefile中声明它必须与B链接。 但是,“make A”不会导致警告,也不会导致错误,并且会创建库A.so。
当然,执行A代码时,f()的调用会因为未定义而崩溃。
有没有办法(链接器选项,代码技巧...)使库A的编译失败? 如何确保库A中引用的所有符号都是在编译时定义的?
感谢您的任何建议。
答案 0 :(得分:1)
最简单的方法:在makefile中添加一个“test_lib”目标,它将使用从libraryA中提取的所有符号生成二进制文件。 (不必有任何意义......只需要获取地址,不需要调用函数或任何东西,只需要引用它)。
答案 1 :(得分:1)
罐
我认为我在链接器手册(d'ho)中找到了一些有趣甚至更简单的东西
如果链接末尾有任何未定义的符号,则-z defs选项和--no-undefined选项会强制发生致命错误。构建可执行文件时,此模式是默认模式。由于历史原因,在构建共享对象时,此模式不是默认模式。建议使用-z defs选项,因为此模式可确保构建的对象是自包含的。自包含对象具有内部解析的所有符号引用,或者对象的直接依赖性。