在静态库中命名空间内的简单函数编译错误

时间:2013-03-31 02:23:20

标签: c++ compiler-errors static-libraries

我遇到了一个奇怪的挑战:我的静态库构建并且可以在没有这些日志记录功能的情况下使用,但是当我包含它们时,我无法编译包含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); }

dove 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)

1 个答案:

答案 0 :(得分:1)

对原始问题发表评论后,似乎某些宏与相关代码中使用的函数名称之间存在冲突。

这可以通过以下事实来确定:错误消息对于实际的代码行没有意义 - 相关行中没有“字符串常量”。

修复既可以是#undef log也可以是#undef debug,也可以使用不同的名称来表示宏或函数。

[不使用小写宏名称的另一个论点!]