2013-04-07 104 views
1

我正在使用C++在Mountain Lion上的XCode 4.6中編寫代碼。我試圖添加和使用Apache log4cxx庫。我今天早上通過Brew安裝了這個庫。我正在鏈接liblog4cxx.dylib。我理解的只是一個符號不能被發現鏈接錯誤:將XCode項目動態鏈接到lib4cxx庫時,如何解決單符號鏈接錯誤?

用於建築x86_64的未定義符號:
「log4cxx ::記錄儀:: forcedLog(log4cxx ::助手:: ObjectPtrT 常量& ,性病:: __ 1 :: basic_string的, 的std :: __ 1 ::分配器>常量&,log4cxx :: SPI :: LocationInfo常量&) 常量」,從引用:

我知道這是查找該庫文件,因爲如果我刪除它,我會得到更多未定義的符號錯誤與log4cxx有關。

相關的代碼基本上是:

#include <log4cxx/logger.h> 

static LoggerPtr logger(log4cxx::Logger::getLogger("foo.bar.Baz")); 

void foo(int p1, int p2) 
{ 
    LOG4CXX_WARN(logger, "blah blah blah"); 
} 

創建函數內部的記錄對象,無論是靜態或沒有,不改變行爲。此外,與靜態庫鏈接,無論是否在我的項目中定義LOG4CXX_STATIC,都不會改變行爲。

看着我打來的宏,我看到這個符號是執行日誌操作的實際方法。如果取出日誌記錄調用,但留在定義記錄器對象的代碼中,則代碼鏈接正常,如您所期望的那樣。

我需要做些什麼才能解決最後一個符號?

TIA!

+0

首先嚐試'nm -g liblog4cxx.dylib',看看符號是否被導出。如果沒有,那麼記錄器的分配可能會出錯。嘗試自己構建'liblog4cxx.dylib'。 – 2013-04-07 19:00:00

+0

我遇到同樣的問題。我看到列出的未定義符號爲:「log4cxx :: Logger :: forcedLog(log4cxx :: helpers :: ObjectPtrT const&,std :: __ 1 :: basic_string ,std :: __ 1 :: allocator > const&,log4cxx :: spi :: LocationInfo const&)const「我會注意到我在32位環境下工作,但是我構建了通用dylib。無論如何,如果我做nm -g我看到: 「__ZNK7log4cxx6Logger11forcedLogLSERKNS_7helpers10ObjectPtrTINS_5LevelEEERKSsRKNS_3spi12LocationInfoE」這導致我相信它在那裏。有什麼建議麼? – lvicks 2014-01-10 22:01:16

回答

0

我將我的問題追溯到在非C++ 11編譯器中編譯庫,但後來我的目標項目是C++ 11編譯器。

我能夠通過查看更改在開發git倉庫,其主要由插入static_casts來log4cxx編譯log4cxx在C + 11編譯器,如在此更新:

http://apache-logging.6191.n7.nabble.com/C-11-does-not-allow-char-literals-with-highest-bit-set-unless-cast-td34908.html

我假設少數不兼容的例程未定義,這就是爲什麼我們只能看到幾個看似隨機的未定義而感到困惑。 (或者我是無論如何)