jbagg / QtZeroConf

Qt wrapper class for ZeroConf libraries across various platforms.
Other
69 stars 51 forks source link

Cannot build example on FreeBSD #55

Closed probonopd closed 1 year ago

probonopd commented 1 year ago

Cannot build example on FreeBSD with -DBUILD_EXAMPLE=1:

mkdir build
cd build
cmake .. -DBUILD_EXAMPLE=1
make
(...)
[ 11%] Automatic MOC for target QtZeroConf
[ 11%] Built target QtZeroConf_autogen
[ 22%] Building CXX object CMakeFiles/QtZeroConf.dir/QtZeroConf_autogen/mocs_compilation.cpp.o
[ 33%] Building CXX object CMakeFiles/QtZeroConf.dir/qzeroconfservice.cpp.o
[ 44%] Linking CXX static library libQtZeroConf.a
[ 44%] Built target QtZeroConf
[ 55%] Automatic MOC and UIC for target QtZeroConfExample
[ 55%] Built target QtZeroConfExample_autogen
[ 66%] Building CXX object example/CMakeFiles/QtZeroConfExample.dir/QtZeroConfExample_autogen/mocs_compilation.cpp.o                                                                              
[ 77%] Building CXX object example/CMakeFiles/QtZeroConfExample.dir/window.cpp.o
[ 88%] Building CXX object example/CMakeFiles/QtZeroConfExample.dir/main.cpp.o
[100%] Linking CXX executable QtZeroConfExample
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: CMakeFiles/QtZeroConfExample.dir/QtZeroConfExample_autogen/mocs_compilation.cpp.o: in function `mainWindow::~mainWindow()':
mocs_compilation.cpp:(.text._ZN10mainWindowD2Ev[_ZN10mainWindowD2Ev]+0x38): undefined reference to `QZeroConf::~QZeroConf()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: CMakeFiles/QtZeroConfExample.dir/window.cpp.o: in function `mainWindow::mainWindow()':
window.cpp:(.text+0x92): undefined reference to `QZeroConf::QZeroConf(QObject*)'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: window.cpp:(.text+0x27c): undefined reference to `QZeroConf::~QZeroConf()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: CMakeFiles/QtZeroConfExample.dir/window.cpp.o: in function `mainWindow::stopPublishClicked()':
window.cpp:(.text+0x1016): undefined reference to `QZeroConf::stopServicePublish()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: CMakeFiles/QtZeroConfExample.dir/window.cpp.o: in function `mainWindow::appStateChanged(Qt::ApplicationState)':
window.cpp:(.text+0x11ba): undefined reference to `QZeroConf::stopServicePublish()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: window.cpp:(.text+0x11c7): undefined reference to `QZeroConf::stopBrowser()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: window.cpp:(.text+0x11f4): undefined reference to `QZeroConf::publishExists()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: window.cpp:(.text+0x1212): undefined reference to `QZeroConf::browserExists()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: CMakeFiles/QtZeroConfExample.dir/window.cpp.o: in function `mainWindow::startPublish()':
window.cpp:(.text+0x12c0): undefined reference to `QZeroConf::clearServiceTxtRecords()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: window.cpp:(.text+0x12f6): undefined reference to `QZeroConf::addServiceTxtRecord(QString, QString)'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: window.cpp:(.text+0x133a): undefined reference to `QZeroConf::addServiceTxtRecord(QString)'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: window.cpp:(.text+0x13a9): undefined reference to `QZeroConf::startServicePublish(char const*, char const*, char const*, unsigned short)'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: CMakeFiles/QtZeroConfExample.dir/window.cpp.o: in function `QZeroConf::startBrowser(QString)':
window.cpp:(.text._ZN9QZeroConf12startBrowserE7QString[_ZN9QZeroConf12startBrowserE7QString]+0x2c): undefined reference to `QZeroConf::startBrowser(QString, QAbstractSocket::NetworkLayerProtocol)'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: ../libQtZeroConf.a(mocs_compilation.cpp.o):(.data.rel.ro+0x88): undefined reference to `QZeroConf::~QZeroConf()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: ../libQtZeroConf.a(mocs_compilation.cpp.o):(.data.rel.ro+0x90): undefined reference to `QZeroConf::~QZeroConf()'
c++: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [example/CMakeFiles/QtZeroConfExample.dir/build.make:134: example/QtZeroConfExample] Fehler 1
make[1]: *** [CMakeFiles/Makefile2:155: example/CMakeFiles/QtZeroConfExample.dir/all] Fehler 2
make: *** [Makefile:136: all] Fehler 2
probonopd commented 1 year ago

make --trace output:

[ 66%] Linking CXX executable QtZeroConfExample
cd /tmp/QtZeroConf/build/example && /usr/local/bin/cmake -E cmake_link_script CMakeFiles/QtZeroConfExample.dir/link.txt --verbose=
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: CMakeFiles/QtZeroConfExample.dir/QtZeroConfExample_autogen/mocs_compilation.cpp.o: in function `mainWindow::~mainWindow()':
mocs_compilation.cpp:(.text._ZN10mainWindowD2Ev[_ZN10mainWindowD2Ev]+0x38): undefined reference to `QZeroConf::~QZeroConf()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: CMakeFiles/QtZeroConfExample.dir/window.cpp.o: in function `mainWindow::mainWindow()':
window.cpp:(.text+0x92): undefined reference to `QZeroConf::QZeroConf(QObject*)'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: window.cpp:(.text+0x27c): undefined reference to `QZeroConf::~QZeroConf()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: CMakeFiles/QtZeroConfExample.dir/window.cpp.o: in function `mainWindow::stopPublishClicked()':
window.cpp:(.text+0x1016): undefined reference to `QZeroConf::stopServicePublish()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: CMakeFiles/QtZeroConfExample.dir/window.cpp.o: in function `mainWindow::appStateChanged(Qt::ApplicationState)':
window.cpp:(.text+0x11ba): undefined reference to `QZeroConf::stopServicePublish()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: window.cpp:(.text+0x11c7): undefined reference to `QZeroConf::stopBrowser()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: window.cpp:(.text+0x11f4): undefined reference to `QZeroConf::publishExists()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: window.cpp:(.text+0x1212): undefined reference to `QZeroConf::browserExists()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: CMakeFiles/QtZeroConfExample.dir/window.cpp.o: in function `mainWindow::startPublish()':
window.cpp:(.text+0x12c0): undefined reference to `QZeroConf::clearServiceTxtRecords()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: window.cpp:(.text+0x12f6): undefined reference to `QZeroConf::addServiceTxtRecord(QString, QString)'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: window.cpp:(.text+0x133a): undefined reference to `QZeroConf::addServiceTxtRecord(QString)'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: window.cpp:(.text+0x13a9): undefined reference to `QZeroConf::startServicePublish(char const*, char const*, char const*, unsigned short)'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: CMakeFiles/QtZeroConfExample.dir/window.cpp.o: in function `QZeroConf::startBrowser(QString)':
window.cpp:(.text._ZN9QZeroConf12startBrowserE7QString[_ZN9QZeroConf12startBrowserE7QString]+0x2c): undefined reference to `QZeroConf::startBrowser(QString, QAbstractSocket::NetworkLayerProtocol)'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: ../libQtZeroConf.a(mocs_compilation.cpp.o):(.data.rel.ro+0x88): undefined reference to `QZeroConf::~QZeroConf()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: ../libQtZeroConf.a(mocs_compilation.cpp.o):(.data.rel.ro+0x90): undefined reference to `QZeroConf::~QZeroConf()'
c++: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [example/CMakeFiles/QtZeroConfExample.dir/build.make:134: example/QtZeroConfExample] Error 1
make[1]: *** [CMakeFiles/Makefile2:155: example/CMakeFiles/QtZeroConfExample.dir/all] Error 2
make: *** [Makefile:136: all] Error 2
FreeBSD% cat ./example/CMakeFiles/QtZeroConfExample.dir/link.txt
/usr/bin/c++ CMakeFiles/QtZeroConfExample.dir/QtZeroConfExample_autogen/mocs_compilation.cpp.o CMakeFiles/QtZeroConfExample.dir/window.cpp.o CMakeFiles/QtZeroConfExample.dir/main.cpp.o -o QtZeroConfExample  -Wl,-rpath,/usr/local/lib/qt5:/usr/local/lib ../libQtZeroConf.a /usr/local/lib/qt5/libQt5Widgets.so.5.15.5 /usr/local/lib/qt5/libQt5Network.so.5.15.5 /usr/local/lib/qt5/libQt5Gui.so.5.15.5 /usr/local/lib/qt5/libQt5Core.so.5.15.5 -Wl,-rpath-link,/usr/local/lib 
probonopd commented 1 year ago

If one removes he if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") condition in CMakeLists.txt (or changes it to also cover FreeBSD), then the situation improves somewhat:

FreeBSD% LANG=C make
[  9%] Automatic MOC for target QtZeroConf
[  9%] Built target QtZeroConf_autogen
Consolidate compiler generated dependencies of target QtZeroConf
[ 54%] Built target QtZeroConf
[ 63%] Automatic MOC and UIC for target QtZeroConfExample
[ 63%] Built target QtZeroConfExample_autogen
Consolidate compiler generated dependencies of target QtZeroConfExample
[ 72%] Linking CXX executable QtZeroConfExample
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: ../libQtZeroConf.a(qt-watch.cpp.o): undefined reference to symbol 'avahi_age'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: /usr/local/lib/libavahi-common.so.3: error adding symbols: DSO missing from command line
c++: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [example/CMakeFiles/QtZeroConfExample.dir/build.make:135: example/QtZeroConfExample] Error 1
make[1]: *** [CMakeFiles/Makefile2:155: example/CMakeFiles/QtZeroConfExample.dir/all] Error 2
make: *** [Makefile:136: all] Error 2

The symbol in question seems to be coming from avahi-common:

FreeBSD% grep -r avahi_age /usr/local/include 
/usr/local/include/avahi-common/timeval.h:AvahiUsec avahi_age(const struct timeval *a);
probonopd commented 1 year ago

Turns out that /tmp/QtZeroConf/build/example/CMakeFiles/QtZeroConfExample.dir/link.txt is missing /usr/local/lib/libavahi-common.so. Manually adding it works as a workaround. Probably libavahi-common must be added somewhere in CMake.

probonopd commented 1 year ago

Thanks @jbagg, tested, works :+1: