3

我想知道当链接器找不到源文件中引用的符号时,我将如何让 CMake 产生错误或至少是警告?

例如,假设我有 foo.c:

#include "bar.h" //bar.h provides bar()

void foo(void)
{
  bar()
  return;
}

在我构建静态库的情况下,如果我不知道如何使用 add_library() 指令,默认行为似乎是甚至不警告 bar 是 foo 的对象存档文件中的未引用符号(。一个)

4

2 回答 2

2

用于构建共享库的CMAKE_SHARED_LINKER_FLAGS 编译器标志应该让编译器做你想做的事。

set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined") 在 Unix 系统上,这将使链接器报告来自目标文件的任何未解析的符号(当您在 CMake 项目中编译许多目标时,这是非常典型的,但不要以正确的顺序链接目标依赖项)。

来源:http ://www.cmake.org/Wiki/CMake_Useful_Variables

于 2014-12-18T07:26:09.037 回答
0

这些天有-z nowGCC 链接器,但是,这不是 CMake 的问题。

我发现的最简单的方法仅适用于共享库,但您所做的基本上是为每个共享库编写一个测试,然后它就执行dlopen(path, RTLD_NOW)(对于 Windows 类似),然后使用它的返回值作为测试返回价值。为了获得所有共享对象的列表,我有一个包装函数add_library,它将所有共享库添加到一个全局属性,然后用于动态生成测试。我记得有一些方法可以判断目标是共享的还是静态的,但我现在没有在文档中找到它。

于 2013-09-19T00:42:07.693 回答