【问题标题】:G++/GCC Compiler is giving undefined reference error when optiomzation is turned off关闭优化时 G++/GCC 编译器给出未定义的引用错误
【发布时间】:2015-03-07 03:52:26
【问题描述】:

我有一个巨大的 C++ 程序,它使用 -O3 优化编译得很好,但在使用 -g 选项编译时会出现“未定义的对 strings_array_multilevel 变量的引用”错误(删除了 -O3)。

我已经稍微减少了测试用例。如果您遇到类似的错误,请告诉我您是如何解决的。我有一个名为 libtest.so 的库。文件 test.c 使用标准 gcc 命令编译到库中。需要注意的是,头文件 test.h 有一个数组声明为 extern (strings_array_multilevel)

const struct mystruct elem3 =  {
                        {30, 9, 26},
                        {
                            {
                                {9, 9},
                                {9, 9}
                            },
                            {
                                {9, 11},
                                {9, 11}
                            }
                        },
                        (char**)strings_array_multilevel
                    };

test.h : 请看这里http://pastebin.com/rPULDeXk

include <stdio.h>

const int NUM_AIRORTS = 10;
const int NUM_REGIONS = 1024;

struct mystruct {
    int field1[3];
    int field2[2][2][2];
    char ** strings;
};

extern const char* strings_array_multilevel[NUM_AIRORTS][NUM_REGIONS];

const struct mystruct elem0 = {
                            {0,0,0},  
                            {
                                {
                                    {0,0},
                                    {0,0}
                                },
                                {
                                    {0,0},
                                    {0,0}
                                }
                            },
                            0
                        };

const struct mystruct elem1 = {
                        {30, 9, 26},
                        {
                            {
                                {9, 9},
                                {9, 9}
                            },
                            {
                                {9, 11},
                                {9, 11}
                            }
                        },
                        NULL
                    };

const struct mystruct elem2 = {
                       {0,0,0},  
                       {
                           {
                               {0,0},
                               {0,0}
                           },
                           {
                               {0,0},
                               {0,0}
                           }
                       },
                       NULL
                   };                    

const struct mystruct elem3 = {
                        {30, 9, 26},
                        {
                            {
                                {9, 9},
                                {9, 9}
                            },
                            {
                                {9, 11},
                                {9, 11}
                            }
                        },
                        (char**)strings_array_multilevel
                    };



int doStuff (int index1, int latency);

test.c : 请看这里http://pastebin.com/GnSZAZUx

#include <stdio.h>
#include "test.h"

const struct mystruct* mystructarray[4] = {&elem0, &elem1, &elem2, &elem3};

int doStuff (int index1, int index) {
    int retVal = 0;
    retVal = mystructarray[index1]->field1[index];
    return retVal;
}

const char* strings_array_multilevel[NUM_AIRORTS][NUM_REGIONS] =
{
    {
        "SJC", "SFO", "OAK"
    },
    {
        "NYC", "WP", "LGA", "PHY"
    }
};

Makefile :请看这里http://pastebin.com/y4LMg2SR

all:
        g++ -fpic -c test.c -o test.o
        g++ -shared -o libtest.so test.o

clean:
        rm test.o libtest.so

现在,当我在我的项目中包含 test.h 并使用选项 -g 将其与 libtest.so 链接时,出现以下错误

cat use_library.c 
#include <stdio.h> 
int main () { 
    printf ("hello world\n"); 
    return 0; 
}

以下作品。

g++ -O3 use_library.c -L<original_directory> -ltest     

以下失败

g++ -g use_library.c -L<original_directory> -ltest     


Undefined reference to  strings_array_multilevel

如果你能解决这个问题,请告诉我。抱歉,由于代码的私密性,我不能在这里分享。

谢谢

【问题讨论】:

  • 同时使用-g-O3 进行编译会发生什么?
  • 是的 "==" 是一个错字。现在更正了。
  • @ChristopherCreutzig,当我同时使用两者时,错误不存在。我使用“nm”命令/实用程序并验证 strings_array_multilevel 在导出的库中定义。
  • -g-O 是不同的选项(-g 被转换为 -g2)。 -g 是调试信息,-O 是优化信息。它们没有纠缠在一起,您可以使用-O0 -g3-O3 and -g2 构建。一个不影响另一个。如果您想获得最大的调试信息,请使用-g3-g3 包括符号定义。
  • 为什么用g++和gcc编译?这将导致这些名称的差异。

标签: c++ c++11 gcc linker


【解决方案1】:

很简单:如果启用优化,编译器会内联函数。无需链接库函数。如果关闭优化,则需要 lib 中的函数。解决方案:链接到包含所需功能的库!您必须添加类似

的内容
g++    -g -O3 use_library.cpp -L<LIBDIR> -l<libname>

我相信您的文件test 不包含所需的功能!在 c++ 中必须注意名称修饰!如果链接到 c 库,如果库头中没有保护,则必须使用 extern "C" 包含库中的头。

作为提示:如果您的文件太少,请在此处提供全文。跟随外部链接阅读是不好的。

【讨论】:

  • 嗯,我从哪里开始?你的-l&lt;libname&gt; 放错地方了,不会做任何事情。让我们从那里开始。 :)
  • 以 extern "C" 开头 :-)
  • @Klaus,感谢您的回复。正如我之前提到的,我使用了 nm 实用程序并检查了该符号确实存在于库中。请注意,在 use_library.cpp 中没有调用库中的任何函数,但它仍然给出错误。我也尝试了 extern 'C' 选项,但结果相同。
  • @Klaus,由于代码超过 50 行,我认为跟踪外部链接会更容易。我现在内联发布了谢谢 -
猜你喜欢
  • 2016-12-09
  • 2021-03-14
  • 2013-10-07
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 2021-12-23
  • 2014-09-18
相关资源
最近更新 更多