我从具有内联函数的GCC 4.8.1那里得到一个非常奇怪的错误.

我在src/include/的头文件(debug.herror.h)中定义了两个几乎相同的内联函数,唯一的区别是它们打印的内容——一个是消息的前缀DEBUG:,另一个是%s: error: %s(程序名、错误消息).在内联定义函数和编译调试构建(因此它设置了宏DEBUG=1)时,我会遇到很多未定义的引用错误:

src/main_debug.o
  gcc -osrc/main_debug.o src/main.c -c -Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g -DCC="\"gcc\"" -DCFLAGS="\"-Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g\"" -DDEBUG=1 -DBTCWATCH_VERSION="\"0.0.1\""

src/lib/btcapi_debug.o
  gcc -osrc/lib/btcapi_debug.o src/lib/btcapi.c -c -Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g -DCC="\"gcc\"" -DCFLAGS="\"-Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g\"" -DDEBUG=1

src/lib/libbtcapi_debug.a
  ar rc src/lib/libbtcapi_debug.a src/lib/btcapi_debug.o
  ranlib src/lib/libbtcapi_debug.a

src/lib/cmdlineutils_debug.o
  gcc -o src/lib/cmdlineutils_debug.o src/lib/cmdlineutils.c -c -Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g -DCC="\"gcc\"" -DCFLAGS="\"-Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g\"" -DDEBUG=1

src/lib/libcmdlineutils_debug.a
  ar rc src/lib/libcmdlineutils_debug.a src/lib/cmdlineutils_debug.o
  ranlib src/lib/libcmdlineutils_debug.a

debug
  gcc -obtcwatch-debug src/main_debug.o -Lsrc/lib/ -lbtcapi_debug -lcmdlineutils_debug -lcurl  -ljansson 
src/main_debug.o: In function `main':
/home/marcoms/btcwatch/src/main.c:148: undefined reference to `debug'
src/main_debug.o:/home/marcoms/btcwatch/src/main.c:185: more undefined references to `debug' follow
collect2: error: ld returned 1 exit status
make: *** [debug] Error 1

但是将debug()的定义更改为static inline可以删除错误.但是我从来没有收到过error()的定义中的任何错误,尽管它的辩解是inline,而不是static inline.

这些定义都在标题中(即不是原型)

推荐答案

根据the manual,传递-std=gnu11将启用C99而不是GNU内联语义.

这意味着inlinestatic inlineextern inline的行为都不同.尤其是,inline需要在一个单独的翻译单元中有一个外部定义(您可以在不复制定义的情况下提供该翻译单元,请参见this answer).

C++相关问答推荐

如何从C中的公钥字符串创建EVP_PKEY

命名信号量不会像进程之间同步中假设的那样工作

C strlen on char array

sizeof结果是否依赖于字符串的声明?

具有交换链获取和命令缓冲区提交的同步-危险-读后写错误

我在这里正确地解释了C操作顺序吗?

将返回的char*设置为S在函数中定义的字符串文字可能会产生什么问题?

Boyer Moore算法的简单版本中的未定义行为

如何使用FSeek和文件流指针在C中查找文件的前一个元素和前一个减go 一个元素

C语言中的外部关键字

如何在双向表中实现线程安全,每个条目仅使用4位,同时避免任何全局锁?

CS50判断灯泡运动的问题,判断时多出一个灯泡,但不在终端上

S,在 struct 中创建匿名静态缓冲区的最佳方式是什么?

C编译和运行

Makefile无法将代码刷新到ATmega328p

按字典顺序打印具有给定字符的所有可能字符串

如何不断地用C读取文件?

c如何传递对 struct 数组的引用,而不是设置 struct 的副本

System V 消息队列由于某种原因定期重置

10 个字节对于这个 C 程序返回后跳行的能力有什么意义