2013-03-31 38 views
1

我遇到一個奇怪的挑戰命名空間的內部功能簡單:我的靜態庫的建立,可以不用這些日誌記錄功能可以使用,但是當我有他們,我不能編譯代碼,包括dove.h然後鏈接到libdove.a。我最初移動了dove名稱空間之外的所有日誌函數,並在dove.cpp中聲明/定義了它們,並且工作正常。 然而,泄漏的函數簽名,我想重用他們 一個獨立的項目。編譯錯誤的靜態庫

dove.h:

namespace dove { 
    /* Many functions and classes */ 

    void log(const char* msg, int level); 
    void info(const char* msg);                         
    void error(const char* msg); 
    void debug(const char* msg); 
} 

dove.cpp:

void dove::log(const char* msg, int level) { 
    if (level <= LOG_LEVEL) 
    std::cout << "dove: " << msg << std::endl; 
} 

void dove::info(const char* msg) { log(msg, LOG_INFO); } 
void dove::error(const char* msg) { log(msg, LOG_ERROR); } 
void dove::debug(const char* msg) { log(msg, LOG_DEBUG); } 

鴿子的Makefile部分:

all:                                
    $(CXX) -c $(CFLAGS) $(INC) -o dove.o dove.cpp 
    ar rvs libdove.a dove.o  
    ranlib libdove.a 

所有這些打造完全沒問題!我得到libdove.a,一切似乎都很開心。然而,當我有一個線#include "dove.h"在不同的項目中,我得到以下編譯錯誤上dove.h:

make[1]: Entering directory `<omitted>/dove' 
g++ -c -g -Ilibs/rapidxml-1.13 -o dove.o dove.cpp 
ar rvs libdove.a dove.o 
ar: creating libdove.a 
a - dove.o 
ranlib libdove.a 
make[1]: Leaving directory `<omitted>/dove' 
cd <omitted> && make 
make[1]: Entering directory `<omitted>' 
g++ -g -c -o build/graph.o src/utils/graph.cpp 
g++ -g -c -o build/util.o src/utils/util.cpp 
g++ -g -I<omitted>/dove -Isrc/utils -c -o build/mps.o src/mps.cpp 
In file included from src/mps.cpp:13: 
<omitted>/dove/dove.h:247: error: expected ‘,’ or ‘...’ before string constant 
<omitted>/dove/dove.h:250: error: expected ‘,’ or ‘...’ before string constant 
make[1]: *** [bin/hybrid] Error 1 

這些錯誤總是發生在日誌和調試。從來沒有在信息和錯誤。我將它們放置在鴿子命名空間中的多個位置(頂部,中部,分隔的聲明,底部),這兩個始終抱怨。

的Makefile子項目:

# Contains libdove.a 
DOVE_ROOT ?= $(CURDIR)/../../dove 
LIBS   := -L$(DOVE_ROOT) -ldove 
INC   := -I$(DOVE_ROOT) -Isrc/utils                      
CXXFLAGS  += -g 

all: $(util_o) 
    $(CXX) $(CXXFLAGS) $(INC) -c -o build/mps.o src/mps.cpp 
    $(CXX) $(CXXFLAGS) -o bin/hybrid build/*.o $(LIBS) 
+0

dove.h行247包含什麼行? –

+0

它包含'void log(const char * msg,int level);'。第二個錯誤是在包含'void debug(const char * msg);'的行上。我總是得到兩個編譯錯誤,並總是在這兩個函數 – Hamy

+0

我敢打賭,這裏涉及到「宏魔法」。它表示「期望,或...在字符串常量之前」,但該行沒有字符串常量。告訴我'log'和'debug'可能被轉換爲字符串常量(或者包含字符串常量的東西)。嘗試將名稱更改爲'xlog'和'xdebug'只是爲了澄清這是問題所在。 –

回答

1

發表意見之後原來的問題,似乎有一些宏並在相關的代碼中使用的函數名之間的衝突。沒有「字符串常量」中的相關行 -

這可以通過事實錯誤信息沒有意義的代碼的實際行判斷。

此修復程序要麼是#undef log#undef debug要麼對宏或函數使用不同的名稱。

[另一個不使用小寫宏名稱的說法!]

+0

我正在玩-E標誌來看看我能否發現真正的問題,但到目前爲止還沒有運氣 – Hamy

+0

順便說一句:切換到更合理的日誌記錄「框架」似乎是一個好主意;-) – Hamy