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