C++共享库undefined reference to `FooClass::SayHello()'。

25

我正在制作一个C ++共享库,当我编译使用该库的主要exe时,编译器会给我:

main.cpp:(.text+0x21): undefined reference to `FooClass::SayHello()'
collect2: ld returned 1 exit status

库代码:

fooclass.h

#ifndef __FOOCLASS_H__
#define __FOOCLASS_H__

class FooClass 
{
    public:
        char* SayHello();
};

#endif //__FOOCLASS_H__

fooclass.cpp

#include "fooclass.h"

char* FooClass::SayHello() 
{
    return "Hello Im a Linux Shared Library";
}

使用以下方式进行编译:

g++ -shared -fPIC fooclass.cpp -o libfoo.so

主函数: main.cpp

#include "fooclass.h"
#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
    FooClass * fooClass = new FooClass();

    cout<< fooClass->SayHello() << endl;

    return 0;
}

使用以下方法编译:

g++ -I. -L. -lfoo main.cpp -o main

这台机器是运行Ubuntu Linux 12操作系统的。

谢谢!


3
编译器命令的末尾需要包含库。请参阅https://dev59.com/OWkw5IYBdhLWcg3wVpFi#9966989。 - hmjd
1
不要编写包含两个下划线或以下划线后跟大写字母的名称的包含保护(或任何其他名称)。这些名称已保留给实现。 (这可能与问题的正确答案无关) - Pete Becker
@关闭投票者:我认为这个问题比另一个问题更好(首先,标题不够描述性,其次,另一个问题有很多无关紧要的东西)。 - Wug
1个回答

61
g++ -I. -L. -lfoo main.cpp -o main

是问题所在。最近版本的GCC要求您按照它们彼此依赖的顺序放置目标文件和库——作为一个顺理成章的经验法则,您必须将库标志作为链接器的最后一个开关;即,写成

g++ -I. -L. main.cpp -o main -lfoo

instead.


4
我们可以用qmake指定这个吗? - elyas-bhy
好的回答!很久以前我就已经不再手动通过命令行构建示例项目了。刚刚我花了1个小时来试图弄清楚在使用gcc-6编译项目时“未定义引用”的含义是什么。问题就出在你在这里描述的地方! - Konstantin Burlachenko
2
最近的GCC版本要求...但是为什么?以前它可行! - Cole Tobin
这是重要的一点:> 最近版本的GCC要求您按它们彼此依赖的顺序放置对象文件和库。 - masterxilo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接