2017-02-05 60 views
0

我有兩個項目,都在MacOS上使用clang ++和Xcode構建。鏈接錯誤 - C++ Clang MacOs

我有如下定義的報頭的文庫....(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是一個共享的指針獲得()返回一個指針。

這一切都很好。這是偉大的......,讓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方法,但它對反序列化方法沒有問題。刪除serialize方法,並且只保留正確的反序列化版本。

我不明白這個問題,我不確定如何繼續。有人能教我如何在這種情況下做什麼?

有關如何解決此問題的任何建議?

注意:有問題的庫的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 
+0

顯示您的構建命令。 –

+0

你已經定義了'serializeDB'來獲取第一個參數值。然後你用指針調用它。它不應該通過連接階段,應該嗎? – user3188346

+0

@ user3188346哇。我真笨! :D你說得對!我不知道爲什麼圖書館建立,但它確實....然後鏈接失敗。更改指針的引用可修復它!謝謝。我如何讓你的評論成爲這個主題?你先生!需要點! –

回答

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

+0

不是。不知道。有點奇怪。它在一個子庫中。也許是一個問題......我不知道。它現在編譯。你是我的英雄。採取這個接受的答案和代表點....但也是一個巨大的業力提升,你的冠軍! –