链接错误 - C ++ Clang MacOs

时间:2017-02-05 09:31:30

标签: c++ c++11 clang++

我有两个项目,都是在MacOS上用clang ++和Xcode构建的。

我有一个库,其头文件定义如下....(serialization.h)

#pragma once

#include <visionApp/cv/matchers/visual_database.h>

namespace visionApp {
    void serializeDB(visionApp::VisualDb visualDB, std::string fileName);
    visionApp::VisualDb* deserializeDB(std::string fileName);
}

cpp文件如下....(serialization.cpp)

#include "serialization.h"

namespace visionApp {

        void serializeDB(visionApp::VisualDb visualDB, std::string fileName)
        {
        }

        visionApp::VisualDb* deserializeDB(std::string fileName)
        {
           return new visualDB();
        }
}

然后在另一个类中调用该方法.....

void saveRecogniser(std::string fileName)
{
    serializeDB(currentVisualDB.get(), fileName);
}

void loadRecogniser(std::string fileName)
{
    mVisualDatabase.reset(deserializeDB(fileName));
}

注意:currentVisualDB是指向.get()的共享指针,返回一个指针。

这一切都很好。哪个好......并制作libvisionApp.a

但是,当我构建一个只能看到标题的依赖应用程序时,我会收到以下错误....

Undefined symbols for architecture x86_64:
  "visionApp::serializeRecognizer(visionApp::VisualDb*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)", referenced from:
      visionApp::Recogniser::saveRecogniser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in libvisionApp.a(planar_recogniser.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

现在,这个链接错误表明clang无法链接serialize方法,但是deserialize方法没有问题。删除序列化方法,只保留正确的反序列化。

我不明白这个问题,我不确定如何继续。在某种情况下,有人能教育我做什么吗?

关于如何解决这个问题的任何建议?

注意:相关库的Lipo输出。

Hal:Release daniel$ lipo -info libvisionDB.a
input file libvisionDB.a is not a fat file
Non-fat file: libvisionDB.a is architecture: x86_64

1 个答案:

答案 0 :(得分:0)

您已声明serializeDB按值获取第一个参数。

void serializeDB(visionApp::VisualDb visualDB, std::string fileName);

调用函数时,使用指针作为第一个参数:

void saveRecogniser(std::string fileName)
{
    serializeDB(currentVisualDB.get(), fileName); // You said that currentVisualDB is a std::shared_ptr
}

我不知道为什么你的构建会进入链接阶段,它不应该。也许您有多个地方宣布serializeDB

相关问题