C ++多阶段链接

时间:2013-06-28 08:01:27

标签: c++ linker g++ libraries

好的,所以这可能不是一个很好的问题,但我有点卡住了。

我有3个程序:

  

pegio.c / pegio.h - 我的设备的硬件初始化和功能

     

PegIOHandler.cpp / PegIOHandler.h - 处理设备的I / O

     

PegRTU.cpp - 主要功能

我的项目实现了opendnp3(允许使用DNP3协议传输数据)库。 现在,为了编译它我首先编译pegio.c文件

gcc -c pegio.c -o pegio.o

很容易,到此为止我理解。

其次我编译IOHandler并引用pegio.c,因为它使用它。

g++ -c PegIOHandler.cpp pegio.c -o PegIOHandler.o -std=c++0x

现在它给了我以下输出。

  

g ++:警告:pegio.o:链接器输入文件未使用,因为链接未完成

但是,它仍然会创建目标文件。但是,PegIOHandler实现了opendnp3头文件,它包含在PegIOHandler.cpp和PegIOHandler.h中。当我尝试在不使用'-c'的情况下编译这些文件时,它告诉我对opendnp3文件有未定义的引用。我知道我必须将它们链接到我的项目,但我该怎么做?

然后编译我的第三个也是最后一个文件:

g++ PegRTU.cpp pegio.o PegIOHandler.o -o pegrtu -std=c++0x

现在告诉我,对opendnp3文件有未定义的引用。 那么:如何将opendnp3库链接到我的项目/代码文件? 谢谢!

1 个答案:

答案 0 :(得分:3)

哎哟。这么多的误会。您不需要先前编译的目标文件来将更多源文件编译为目标代码。但是,您需要在编译过程结束时将它们链接在一起,包括所需的任何库。总而言之:

gcc -c pegio.c -o pegio.o
g++ -c PegIOHandler.cpp -o PegIOHandler.o -std=c++0x
g++ -c PegRTU.cpp -o PegRTU.o -std=c++0x
g++ -o executable_name *.o -lopendnp3 # or whatever linker flag is needed for OpenDNP3

非常好, read this.