我想知道当链接器找不到源文件中引用的符号时,我会如何让CMake产生错误,或者至少是警告?
例如,假设我有foo.c:
#include "bar.h" //bar.h provides bar()
void foo(void)
{
bar()
return;
}
如果我正在构建一个静态库,如果我不知道我如何使用我的add_library()指令,那么默认行为似乎甚至不会发出警告:bar是foo中的一个未引用的符号对象存档文件(.a)
答案 0 :(得分:1)
用于构建共享库的MAKE_SHARED_LINKER_FLAGS编译器标志应该让编译器执行您想要的操作。
设置(CMAKE_SHARED_LINKER_FLAGS“-Wl, - no-undefined”) 在Unix系统上,这将使链接器报告来自目标文件的任何未解析的符号(这在CMake项目中编译许多目标时非常典型,但不要以正确的顺序链接目标依赖项)。 资料来源:http://www.cmake.org/Wiki/CMake_Useful_Variables
答案 1 :(得分:0)
这些天GCC链接器有-z now
,但是,这不是CMake的问题。
我发现的最简单的方法只适用于共享库,但你所做的基本上是为每个共享库编写一个测试,然后只做dlopen(path, RTLD_NOW)
(和Windows类似)然后使用其返回值作为测试返回值。为了获得所有共享对象的列表,我有一个围绕add_library
的包装函数,它将所有共享库添加到全局属性,然后用于动态生成测试。我记得有一些方法可以判断目标是共享的还是静态的,但我现在还没有找到它的文档。