gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:57:09 26 4
gpt4 key购买 nike

我遇到了一个奇怪的挑战:我的静态库构建并可以在没有这些日志记录函数的情况下使用,但是当我包含它们时,我无法编译包含 dove.h 的代码,然后链接到 libdove.a。我最初将所有日志函数移到了 dove 命名空间之外,并在 dove.cpp 中声明/定义了它们,并且成功了。但是,它泄漏了函数签名,我想在一个独立的项目。

鸽子.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);
}

鸽子.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

这些错误总是发生在日志和调试中。永远不会出现信息和错误。我将它们放在 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,或者对宏或函数使用不同的名称。

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

关于c++ - 静态库中命名空间内简单函数的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15725706/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com