<html dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" id="owaParaStyle"></style>
</head>
<body fpstyle="1" ocsi="0">
<div style="direction: ltr;font-family: Tahoma;color: #000000;font-size: 10pt;">Hi
<div><br>
</div>
<div><b>My question in short:</b></div>
<div>Do I need to use DUNE buildsystem functionality (e.g. dune_add_library) to link with an external shared library, or can I use CMake functionality?<br>
<div><br>
</div>
<div><b>The longer explanation:</b></div>
<div>I am working on a DUNE module (ResSim), and I would like to use functions from a shared library (libThermoLib.so) in that code. I have tried to use CMake commands in the following way</div>
<div><br>
</div>
<div><span style="font-size: 13.3333px;">------------------------------------</span><span style="font-size: 13.3333px;">------------------------------------</span><span style="font-size: 13.3333px;">-------------------------------</span><span style="font-size: 13.3333px;">------------------------------------</span></div>
<div><br>
</div>
<div>
<div># Find the ThermoLib library</div>
<div>find_library(thermolib_LIBRARY ThermoLib)</div>
<div>message(STATUS "setting thermolib_LIBRARY="${thermolib_LIBRARY}"")</div>
<div><br>
</div>
<div># Find the ThermoLib include directory</div>
<div>find_path(thermolib_INCLUDE_DIRS ThermoLib.h)</div>
<div>message(STATUS "setting thermolib_INCLUDE_DIRS="${thermolib_INCLUDE_DIRS}"")</div>
<div><br>
</div>
<div># Add library</div>
<div>add_library(thermolib SHARED IMPORTED GLOBAL)</div>
<div>set_target_properties(thermolib PROPERTIES</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>IMPORTED_LOCATION "${thermolib_LIBRARY}"</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>INTERFACE_INCLUDE_DIRECTORIES "${thermolib_INCLUDE_DIRS}")</div>
<div><br>
</div>
<div># Add executable</div>
<div>add_executable("ResSim"<span class="Apple-tab-span" style="white-space:pre">
</span>main.cc)</div>
<div><br>
</div>
<div># Link libraries</div>
<div>target_link_dune_default_libraries("ResSim")</div>
<div>target_link_libraries("ResSim" thermolib)</div>
</div>
<div><br>
</div>
<div><span style="font-size: 13.3333px;">------------------------------------</span><span style="font-size: 13.3333px;">------------------------------------</span><span style="font-size: 13.3333px;">-------------------------------</span><span style="font-size: 13.3333px;">------------------------------------</span></div>
<div><span style="font-size: 13.3333px;"><br>
</span></div>
<div><span style="font-size: 13.3333px;">I use "dunecontrol --module=ResSim --opts=./ResSim/settings/release.opts all" to compile the project, where the release.opts file contains</span></div>
</div>
<div><span style="font-size: 13.3333px;"><br>
</span></div>
<div>
<div style="font-size: 13.3333px;"><span style="font-size: 13.3333px;">------------------------------------</span><span style="font-size: 13.3333px;">------------------------------------</span><span style="font-size: 13.3333px;">-------------------------------</span><span style="font-size: 13.3333px;">------------------------------------</span></div>
</div>
<div><span style="font-size: 13.3333px;"><br>
</span></div>
<div>
<div><span style="font-size: 13.3333px;">CMAKE_FLAGS="</span></div>
<div><span style="font-size: 13.3333px;">-DCMAKE_C_COMPILER='/usr/bin/gcc'</span></div>
<div><span style="font-size: 13.3333px;">-DCMAKE_CXX_COMPILER='/usr/bin/g++'</span></div>
<div><span style="font-size: 13.3333px;">-DCMAKE_CXX_FLAGS='-Wall'</span></div>
<div><span style="font-size: 13.3333px;">-DCMAKE_CXX_FLAGS_DEBUG='-O3 -DNDEBUG -g0 -funroll-loops'</span></div>
<div><span style="font-size: 13.3333px;">-DDUNE_SYMLINK_TO_SOURCE_TREE=1</span></div>
<div><span style="font-size: 13.3333px;">-DCMAKE_BUILD_TYPE=Release</span></div>
<div><span style="font-size: 13.3333px;">-DCMAKE_PREFIX_PATH='/home/tobk/Documents/Projects/ThermoLib/lib;/home/tobk/Documents/Projects/ThermoLib/hdr'</span></div>
<div><span style="font-size: 13.3333px;">"</span></div>
<div><span style="font-size: 13.3333px;">BUILDDIR=release</span></div>
</div>
<div><span style="font-size: 13.3333px;"><br>
</span></div>
<div>
<div style="font-size: 13.3333px;"><span style="font-size: 13.3333px;">------------------------------------</span><span style="font-size: 13.3333px;">------------------------------------</span><span style="font-size: 13.3333px;">-------------------------------</span><span style="font-size: 13.3333px;">------------------------------------</span></div>
</div>
<div><span style="font-size: 13.3333px;"><br>
</span></div>
<div><span style="font-size: 13.3333px;">The -DCMAKE_PREFIX_PATH ensures that find_library and find_path finds libThermoLib.so and its include directory (and I have checked that they do). However, I get a linker error:</span></div>
<div><span style="font-size: 13.3333px;"><br>
</span></div>
<div>
<div><span style="font-size: 13.3333px;">CMakeFiles/ResSim.dir/main.cc.o: In function `main':</span></div>
<div><span style="font-size: 13.3333px;">main.cc:(.text.startup+0x87): undefined reference to `LoadParams(int*, int, int, double*, double*)'</span></div>
<div><span style="font-size: 13.3333px;">collect2: error: ld returned 1 exit status</span></div>
<div style="font-size: 13.3333px;"><br>
</div>
</div>
<div style="font-size: 13.3333px;">where LoadParams is a function defined in libThermoLib.so, i.e.  "<span style="font-size: 13.3333px;">nm -C libThermoLib.so | grep LoadParams" returns</span></div>
<div style="font-size: 13.3333px;"><span style="font-size: 13.3333px;"><br>
</span></div>
<div style="font-size: 13.3333px;">
<div style="font-size: 13.3333px;">0000000000001b50 T LoadParams</div>
<div style="font-size: 13.3333px;"><br>
</div>
<div style="font-size: 13.3333px;">From what I have found in various StackOverflow threads etc., the above should work with CMake, but perhaps I've missed something minor. Any help is appreciated.</div>
<div style="font-size: 13.3333px;"><br>
</div>
<div style="font-size: 13.3333px;">PS: The DUNE buildsystem docs appears to be down (https://www.dune-project.org/sphinx/core-2.4/)</div>
<div style="font-size: 13.3333px;"><br>
</div>
<div style="font-size: 13.3333px;">Best regards</div>
<div style="font-size: 13.3333px;">Tobias Ritschel</div>
</div>
</div>
</body>
</html>