Linux,C ++-库,gcc,代码:: blocks中的库链接错误

  • 代码:: blocks版本17.12
  • Ubuntu MATE 19.10 1.22.2
  • gcc-4:9.2.1-3.1ubuntu1
  • libavahi-client3-0.7-4ubuntu5(尽管可能不相关)

我有使用avahi通过网络进行通信的C ++应用程序。这样可以编译并与以下链接:

g++  -o bin/Debug/Zeroconf obj/Debug/AVAHi.o {...} -lavahi-common -lavahi-core -lavahi-common -lavahi-client  

到目前为止,一切都很好。我想将AvaHi功能放入一个静态库中,以使其他开发人员更轻松。理想情况下,我想在静态库中包括Avahi库(以及其他),以使链接更容易,但是看起来其中包含的库必须由可执行文件链接-好的,足够公平。

构建该库的工作正常,并且顺利进行并生成libHomeLib.a。在此运行nm将显示对AvaHi的调用,类似于:

         U avahi_address_snprint
         U avahi_alternative_service_name

因此,不要将其融合为C ++格式。

现在,创建一个简单的C ++可执行文件并将该库与Avahi库一起添加到链接器选项中,可以很好地进行编译并链接:

g++  -o bin/Debug/HomeConsole obj/Debug/main.o  -lglib-2.0 -lavahi-common -lavahi-client  /home/mike/Projects/HomeLib/bin/Debug/libHomeLib.a

(我添加的库没有-l吗?)。 main()只是引用了工厂中声明的静态对象:

CHomeFactory *pFactory = CHomeFactory::get_factory ();

但是,链接失败并显示:

/home/mike/Projects/HomeLib/AVAHi.cpp:27: undefined reference to `avahi_client_new'
/usr/bin/ld: /home/mike/Projects/HomeLib/AVAHi.cpp:29: undefined reference to `avahi_service_browser_new'
...

依此类推,在库中直接或间接命名所有函数,这很奇怪,因为我可以毫不费力地从当前代码中调用任何函数-通过在main中添加一个调用来做到这一点:

avahi_client_new(NULL,(AvahiClientFlags)0,NULL,NULL,NULL);

这次,编译器仅抱怨:

/usr/bin/ld: /home/mike/Projects/HomeLib/bin/Debug/libHomeLib.a(AVAHi.o): undefined reference to symbol 'avahi_string_list_get_service_cookie'
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libavahi-common.so: error adding symbols: DSO missing from command line

因此,我向“ avahi_string_list_get_service_cookie(NULL);”添加了一个调用到主要,并得到一个干净的链接。

冒着具体细节但问题含糊的风险,有人知道到底发生了什么吗?为什么链接不能连接库调用,除非在主可执行文件中引用了它们?

评论