7

我试图在测试阶段加载一个网络配置,它首先有一个内存数据层,然后是一个卷积层。MemoryData 层创建成功,但卷积层的创建在以下位置失败:

LOG(INFO) << "Creating layer " << param.name();
const string& type = param.type();
CreatorRegistry& registry = Registry();
CHECK_EQ(registry.count(type), 1) << "Unknown layer type: " << type
<< " (known types: " << LayerTypeList() << ")";

打印的错误是:

F0519 14:54:12.494139 14504 layer_factory.hpp:77] 检查失败:registry.count(t ype) == 1 (0 vs. 1) 未知层类型:卷积(已知类型:MemoryData)

注册表只有一个条目,实际上是 MemoryData。当进入注册表创建函数时,它看起来像第一个(也是最后一个,因为这是一个单音)从

REGISTER_LAYER_CLASS(MemoryData);

在 memory_data_later.cpp 中。

我看到REGISTER_LAYER_CLASS对其他受支持层的类似调用,但看起来它们从未被调用过。我该如何解决?

谢谢!

4

2 回答 2

7

尝试将 caffe 静态链接到可执行文件时会发生此错误。您需要传递额外的链接器标志以确保包含层注册代码。

如果您使用 cmake,请查看 Targets.cmake:

###########################################################################################
# Defines global Caffe_LINK flag, This flag is required to prevent linker from excluding
# some objects which are not addressed directly but are registered via static constructors
if(BUILD_SHARED_LIBS)
  set(Caffe_LINK caffe)
else()
  if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    set(Caffe_LINK -Wl,-force_load caffe)
  elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
    set(Caffe_LINK -Wl,--whole-archive caffe -Wl,--no-whole-archive)
  endif()
endif()

然后在哪里创建目标:

# target
add_executable(${name} ${source})
target_link_libraries(${name} ${Caffe_LINK})

一个快速的解决方案是将 caffe 构建和链接为共享库而不是静态库。

另见这篇文章

只是为了在 Windows 上完成 MSVC 编译:在目标可执行文件或 dll 上使用/OPT:NOREF/INCLUDE链接器选项。

于 2015-05-22T10:50:11.197 回答
2

在您的 Makefile 中的适当位置替换-l$(PROJECT)为,并删除现在不必要的运行时加载路径: . $(STATIC_LINK_COMMAND)-Wl,-rpath,$(ORIGIN)/../lib

于 2015-08-20T13:34:15.130 回答