Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct
How to link an external library in Qt Creator when LIBS += -L“…” and -l don't seem to work?
I've been trying to use the https://github.com/OpenImageDenoise/oidn#compiling-on-linuxmacos library in my code on Linux but still have no luck as of now. Apparently it seems that I am not linking the library properly but the normal ways to link the library also do not seem to work.
Here's what I've done so far: after compiling OIDN I moved the oidn directory to the directory where my path tracer code is and did the following in my code (C++11) which I'm working on in Qt Creator.
#include "oidn/include/OpenImageDenoise/oidn.hpp" . . . oidn::DeviceRef device = oidn::newDevice(); // this is where things break device.commit();
Note that doing
#include "oidn/include/OpenImageDenoise/oidn.hpp"seems to work fine because autocomplete works for oidn and shows its members. However I get the following errors which seems to be due to not linking oidn libraries.
I tried linking the libraries via
LIBS += -L"oidn/build/"or
LIBS += -L"oidn/build/libOpenImageDenoise.so"(as shown in the image) but I get the same errors. I also tried
LIBS += -L oidn/build -lOpenImageDenoisebut got the error message
"cannot find -lOpenImageDenoise". I am now pretty confused on what I'm supposed to do. I'm not even sure if the errors are due to not properly linking libraries because I see people generally link libraries in C++ the same way I am trying to do it here. I would really appreciate if someone can help me figure out what I need to do to get OIDN work.
Hi and welcome to devnet,
Where did you install that library on your system ?
I'm not sure what you mean by "install" but I followed the steps described in the Intel Open Image Denoise page (https://github.com/OpenImageDenoise/oidn#compiling-on-linuxmacos) to compile the package via cmake and make. I first cloned the OIDN repo somewhere outside my code directory (
~/Desktop/pathtracer). Then after compilation I moved the oidn directory to
~/Desktop/pathtracer. You can see the directories below to get a better idea about the structure of my files:
pathtracer/oidn/include/OpenImageDenoisedirectory (I'm supposed to use the .hpp file since I am using C++11:
Then you should use the full path to the folder containing your library in the -L statement of your Qt project as the current location is not part of any search paths used by the linker.
Pablo J. Rogina last edited by
if someone can help me figure out what I need to do to get OIDN work.
Have you already checked this article "Third Party Libraries"?
In particular this line:
LIBS += -L"3rdparty/CatWhisperer/lib" -lCatWhisperer
In addition, you may want to consider installing/having the library "outside" your project, since what will happen if you need to create another different project (Qt app) using that same library? Are you going to duplicate the headers/.so files into the new project? I don't think so...
@SGaist I used the followings and still get the errors
cannot find -lOpenImageDenoiseor
cannot find -loidn. Am I supposed to do something else?
LIBS += -L "/home/Warrior/Desktop/pathtracer/oidn/build" -lOpenImageDenoise
LIBS += -L "/home/Warrior/Desktop/pathtracer/oidn/build" -loidn
@SGaist Also, how can I add the library paths to the search path you mentioned? Maybe that makes my life easier
JonB last edited by
LIBS += -L"oidn/build/"
Although you say you started your
-Llike this and things still didn't work, why have you changed over to
LIBS += -L oidn/buildfrom then on always? I cannot test, but I see no evidence from
man gccthat you can put a space between -
Land the directory name, and no examples do. I'd start by removing it, in case....
@JonB Thanks for noticing this. I also tried with the following and still get the same error of
cannot find -lOpenImageDenoise:
LIBS += -L"/home/Warrior/Desktop/pathtracer/oidn/build" -lOpenImageDenoise
Any other thoughts? :( This is really strange. I'm not sure what else I need to do.
Can your show your .pro file content ?
@SGaist Sure. There you go:
QT += gui QT += xml CONFIG += c++11 console CONFIG -= app_bundle # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 QMAKE_CXXFLAGS += -msse2 QMAKE_CXXFLAGS += -fopenmp LIBS += -fopenmp LIBS += -L"/home/Warrior/Desktop/pathtracer/oidn/build/" -lOpenImageDenoise SOURCES += main.cpp \ pathtracer.cpp \ scene/scene.cpp \ BVH/BBox.cpp \ BVH/BVH.cpp \ scene/camera.cpp \ scene/basiccamera.cpp \ util/CS123XmlSceneParser.cpp \ scene/shape/mesh.cpp \ scene/shape/triangle.cpp HEADERS += \ pathtracer.h \ scene/scene.h \ BVH/BBox.h \ BVH/BVH.h \ BVH/IntersectionInfo.h \ BVH/Log.h \ BVH/Object.h \ BVH/Ray.h \ BVH/Stopwatch.h \ scene/camera.h \ scene/basiccamera.h \ util/CS123Common.h \ util/CS123ISceneParser.h \ util/CS123SceneData.h \ util/CS123XmlSceneParser.h \ scene/shape/Sphere.h \ scene/shape/mesh.h \ scene/shape/triangle.h \ util/tiny_obj_loader.h \ BVH/vector3.h \ oidn/include/OpenImageDenoise/oidn.hpp \ oidn/include/OpenImageDenoise/config.h \ oidn/build/mkl-dnn/include/dnnl_config.h \ INCLUDEPATH += "Eigen/" INCLUDEPATH += "oidn/include/OpenImageDenoise" INCLUDEPATH += "oidn/build/mkl-dnn/include/" INCLUDEPATH += "/oidn/build/" DISTFILES += \ README.txt
That is looking good...
Did you do a full rebuild after modifying these paths ?
Also, did you check that all the symlinks of libOpenImageDenoise are valid and pointing to valid files ?
@SGaist Yes I did do a clean compilation but got the same error. I did not however check the symlinks you mentioned. How can I do that?
How can I do that?
ls -lh /home/Warrior/Desktop/pathtracer/oidn/build/
What is the output of this command?
@jsulm Apparently the files don't show up. Could it be because I cloned and built oidn in another directory first and then moved everything to the path where my program is? or is there a way to fix the symlink issue?
ls -lh /home/Warrior/Desktop/pathtracer/oidn/build/ total 160K drwxrwxr-x 4 Warrior Warrior 4.0K Feb 4 00:09 apps -rw-rw-r-- 1 Warrior Warrior 19K Feb 4 00:09 CMakeCache.txt drwxrwxr-x 7 Warrior Warrior 4.0K Feb 4 00:09 CMakeFiles -rw-rw-r-- 1 Warrior Warrior 6.5K Feb 4 00:09 cmake_install.cmake drwxrwxr-x 3 Warrior Warrior 4.0K Feb 4 00:09 common -rw-r--r-- 1 Warrior Warrior 3.6K Feb 4 00:09 CPackConfig.cmake -rw-r--r-- 1 Warrior Warrior 4.0K Feb 4 00:09 CPackSourceConfig.cmake -rw-rw-r-- 1 Warrior Warrior 103K Feb 4 00:09 Makefile drwxrwxr-x 3 Warrior Warrior 4.0K Feb 4 00:08 mkl-dnn -rw-r--r-- 1 Warrior Warrior 1.6K Feb 4 00:09 OpenImageDenoiseConfigVersion.cmake
This post is deleted!
or is there a way to fix the symlink issue?
Your current issue is not related to sym-links. Your problem is that the folder you pass via -L does NOT contain the libs. Either put them back to this folder or pass the folder containing the libs via -L.
@jsulm Well the folder definitely does contain the libs:
JonB last edited by JonB
Well you can see for yourself that the listing from
lsdoes not match the files/directories in your screenshot.
My guess is that screenshot does not come from navigating to the same directory. (A screenshot from file manager without proof of what directory is showing is not much use.) So you need to look closely to sort this out....
@JonB I totally understand the suspicious discrepancy between the screen shot and the directory listing but I am not trying to be funny and take people's time. They're both from the same path. I think I need to clone the oidn repo in the same directory where my code is and build it there. That can hopefully solve the problem.
They're both from the same path.
No matter what you tell us - no they're not from the same path. Make sure you use the right one and think about e.g. case sensitivity.
JonB last edited by
They're both from the same path.
Can you show us what the file manager says the path it is showing is?
@SGaist @JonB @jsulm @Christian-Ehrlicher Thank you all. I finally managed to fix the issue. I cloned the repo in the same directory where my code is and built it there. Here's what
ls -lh /home/Warrior/Desktop/pathtracer/oidn/buildshows me now and I can successfully build my code and run it. I cannot believe that things didn't work the first time and symlinks were incorrect/missing:
total 51M drwxrwxr-x 4 Warrior Warrior 4.0K Feb 9 10:14 apps -rw-rw-r-- 1 Warrior Warrior 19K Feb 9 10:14 CMakeCache.txt drwxrwxr-x 7 Warrior Warrior 4.0K Feb 9 10:19 CMakeFiles -rw-rw-r-- 1 Warrior Warrior 5.6K Feb 9 10:14 cmake_install.cmake -rw-rw-r-- 1 Warrior Warrior 2.5K Feb 9 10:17 color_ispc_avx2.h -rw-rw-r-- 1 Warrior Warrior 2.5K Feb 9 10:17 color_ispc_avx512skx.h -rw-rw-r-- 1 Warrior Warrior 3.1K Feb 9 10:17 color_ispc.h -rw-rw-r-- 1 Warrior Warrior 2.5K Feb 9 10:17 color_ispc_sse4.h drwxrwxr-x 3 Warrior Warrior 4.0K Feb 9 10:14 common -rw-r--r-- 1 Warrior Warrior 3.3K Feb 9 10:14 CPackConfig.cmake -rw-r--r-- 1 Warrior Warrior 3.7K Feb 9 10:14 CPackSourceConfig.cmake -rw-rw-r-- 1 Warrior Warrior 2.6K Feb 9 10:17 input_reorder_ispc_avx2.h -rw-rw-r-- 1 Warrior Warrior 2.6K Feb 9 10:17 input_reorder_ispc_avx512skx.h -rw-rw-r-- 1 Warrior Warrior 3.1K Feb 9 10:17 input_reorder_ispc.h -rw-rw-r-- 1 Warrior Warrior 2.6K Feb 9 10:17 input_reorder_ispc_sse4.h -rw-rw-r-- 1 Warrior Warrior 41K Feb 9 10:14 libcommon.a -rw-rw-r-- 1 Warrior Warrior 16M Feb 9 10:17 libdnnl.a lrwxrwxrwx 1 Warrior Warrior 24 Feb 9 10:19 libOpenImageDenoise.so -> libOpenImageDenoise.so.0 lrwxrwxrwx 1 Warrior Warrior 28 Feb 9 10:19 libOpenImageDenoise.so.0 -> libOpenImageDenoise.so.1.3.0 -rwxrwxr-x 1 Warrior Warrior 34M Feb 9 10:19 libOpenImageDenoise.so.1.3.0 -rw-rw-r-- 1 Warrior Warrior 37K Feb 9 10:19 libutils.a drwxrwxr-x 2 Warrior Warrior 4.0K Feb 9 10:17 local__core -rw-rw-r-- 1 Warrior Warrior 104K Feb 9 10:14 Makefile drwxrwxr-x 3 Warrior Warrior 4.0K Feb 9 10:14 mkl-dnn -rwxrwxr-x 1 Warrior Warrior 181K Feb 9 10:19 oidnBenchmark -rwxrwxr-x 1 Warrior Warrior 59K Feb 9 10:19 oidnDenoise -rwxrwxr-x 1 Warrior Warrior 882K Feb 9 10:19 oidnTest -rw-r--r-- 1 Warrior Warrior 1.6K Feb 9 10:14 OpenImageDenoiseConfigVersion.cmake -rw-rw-r-- 1 Warrior Warrior 1.5K Feb 9 10:17 output_copy_ispc_avx2.h -rw-rw-r-- 1 Warrior Warrior 1.5K Feb 9 10:17 output_copy_ispc_avx512skx.h -rw-rw-r-- 1 Warrior Warrior 1.9K Feb 9 10:17 output_copy_ispc.h -rw-rw-r-- 1 Warrior Warrior 1.5K Feb 9 10:17 output_copy_ispc_sse4.h -rw-rw-r-- 1 Warrior Warrior 2.5K Feb 9 10:17 output_reorder_ispc_avx2.h -rw-rw-r-- 1 Warrior Warrior 2.5K Feb 9 10:17 output_reorder_ispc_avx512skx.h -rw-rw-r-- 1 Warrior Warrior 3.1K Feb 9 10:17 output_reorder_ispc.h -rw-rw-r-- 1 Warrior Warrior 2.5K Feb 9 10:17 output_reorder_ispc_sse4.h -rw-rw-r-- 1 Warrior Warrior 1.5K Feb 9 10:17 upsample_ispc_avx2.h -rw-rw-r-- 1 Warrior Warrior 1.5K Feb 9 10:17 upsample_ispc_avx512skx.h -rw-rw-r-- 1 Warrior Warrior 1.8K Feb 9 10:17 upsample_ispc.h -rw-rw-r-- 1 Warrior Warrior 1.5K Feb 9 10:17 upsample_ispc_sse4.h drwxrwxr-x 2 Warrior Warrior 4.0K Feb 9 10:17 weights
@Warrior Just as a tip: do not build inside source code tree. Create a build folder and build from there (out of source build):
mkdir build cd build cmake ../SOURCE_CODE_FOLDER make make install
Pablo J. Rogina last edited by
I finally managed to fix the issue
so please don't forget to mark your post as solved!
coffeesmoke last edited by coffeesmoke
QMAKE_LFLAGS += "-Wl,-rpath,\'/home/Warrior/Desktop/pathtracer/oidn/build\'"