[英]Compile error for simple function inside of namespace in static library
我遇到了一個奇怪的挑戰:我的靜態庫可以構建並且可以在沒有這些日志記錄功能的情況下使用,但是當我包含它們時,我將無法編譯包含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
這些錯誤總是在日志和調試時發生。 永遠不會出現信息和錯誤。 我將它們放置在dove名稱空間的多個位置(頂部,中間,分隔的聲明,底部),而這兩個總是令人抱怨。
子項目的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)
在對原始問題進行注釋之后,似乎某些宏與相關代碼中使用的函數名稱之間存在沖突。
錯誤消息對於實際的代碼行沒有意義-在相關行中沒有“字符串常量”,可以確定這一點。
修復方法是#undef log
和#undef debug
,或者為宏或函數使用不同的名稱。
[另一個不使用小寫宏名稱的說法!]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.