我遇到一個奇怪的挑戰命名空間的內部功能簡單:我的靜態庫的建立,可以不用這些日誌記錄功能可以使用,但是當我有他們,我不能編譯代碼,包括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)
dove.h行247包含什麼行? –
它包含'void log(const char * msg,int level);'。第二個錯誤是在包含'void debug(const char * msg);'的行上。我總是得到兩個編譯錯誤,並總是在這兩個函數 – Hamy
我敢打賭,這裏涉及到「宏魔法」。它表示「期望,或...在字符串常量之前」,但該行沒有字符串常量。告訴我'log'和'debug'可能被轉換爲字符串常量(或者包含字符串常量的東西)。嘗試將名稱更改爲'xlog'和'xdebug'只是爲了澄清這是問題所在。 –