2

我在 Linux 中收到以下错误“未定义的引用__line__。我知道 C 具有隐式宏__LINE__。在代码__line__中分配__LINE__

extern int __line__;
LDF(__line__ = __LINE__);

所以__line__这里是一个变量而不是宏,它被赋值为__LINE__. 在这里extern int,所以它应该在某处被宣布为公正int __line__。但是我没有看到声明 _ line _ 的任何头文件或 c 文件。此外,此错误不是在编译 .c 文件期间而是在链接 .o 文件时出现。

此错误不会出现在 UNIX 中。此外,在链接 libgen 时,会链接 libposix4 库。这些库仅存在于 UNIX 中而不存在于 LINUX 中我假设int __line__;这些库中的某处存在或者我该如何解决此错误?

4

3 回答 3

1

@rodrigo @sehe。感谢您的投入。我发现行 int line =0; 在“.c”文件之一中创建该文件的对象,并与更多的对象文件一起创建归档文件“.a”库文件。也就是说,common.c 有 int line = 0; 和 common.o 和一些 xo, yo 被归档以使用命令“ar ruv”创建“libcommon.a”,并且该库被链接以在 makefile 中创建二进制可执行文件作为 -lcommon。再次感谢您的投入!!!!

于 2012-05-07T18:27:50.493 回答
0

__line__不幸的是,标准禁止将其作为便携式标识符。

它在 UNIX 上“工作”的事实是实现定义的,并且您正在见证不可移植的事实。

我唯一的建议是重命名该变量。您可以玩火并在编译标志中添加一些非常邪恶的东西:

-D__line__=MYCODEBASE_LINE__

但我不特别推荐这样的东西

于 2012-05-02T22:02:06.637 回答
0

它可能是一个非标准的、未记录的内部变量,恰好出现在一些使用的库中。

一些聪明的人在你的程序中发现了它的一些用处。您应该尝试了解为什么存在以及是否真的需要它,因为它很可能在 Linux 中根本不存在。

这就是它以双下划线开头的原因:因为该名称是reserved

于 2012-05-03T00:36:19.000 回答