Greetings!
I’m writing an application that links against a shared library libaes.so. libaes.so is available here:
/usr/local/include/libaes/aes.hpp
/usr/local/include/libaes/message.hpp
/usr/local/include/libaes/octet_string.hpp
/usr/local/lib/libaes.so.1
/usr/local/lib/libaes.so
/usr/local/lib/pkgconfig/libaes.pc
CMake finds the pkg-config file and builds my project just fine. I can call into libaes.so from my code. But when running the built executable, it tells me it cannot find libaes.so. When providing the path using LD_PRELOAD it works.
$ tests/secure-tcp-socket
tests/secure-tcp-socket: error while loading shared libraries: libaes.so.1: cannot open shared object file: No such file or directory
$ $ ldd tests/secure-tcp-socket
linux-vdso.so.1 (0x00007ffc3bdde000)
libaes.so.1 => not found
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fc6c8e00000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fc6c90f5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc6c8c1f000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc6c8b3f000)
$ LD_PRELOAD=/usr/local/lib/libaes.so.1 tests/secure-tcp-socket
Server: Running on port 34461. Awaiting connections...
Client: Connecting to 127.0.0.1:34461...
What’s the canonical way of baking the path to libaes.so into the executable? I’m wondering if I made a mistake because CMake should know where to find libaes.so. I’d assume it would use this info if it could.
Being a new user, I cannot yet upload attachments, so please find the relevant CMakeLists.txt below.
Thanks in advance!
cmake_minimum_required( VERSION 3.13.4 )
## ========================= ###
## --- secure-tcp-socket --- ###
## ========================= ###
add_library( secure_tcp_socket STATIC )
set_target_properties( secure_tcp_socket
PROPERTIES
CXX_STANDARD 11
PUBLIC_HEADER "inc/ecdh_handshaker.hpp;inc/secure-tcp-server.hpp;inc/secure-tcp-client.hpp" # for install()
)
# target_compile_definitions( secure_tcp_socket PUBLIC BOOST_ASIO_ENABLE_HANDLER_TRACKING )
find_package( PkgConfig REQUIRED )
pkg_check_modules( AES REQUIRED libaes )
target_include_directories( secure_tcp_socket
PUBLIC inc
PRIVATE ${AES_INCLUDE_DIRS} )
target_sources( secure_tcp_socket
PRIVATE ecdh_handshaker.cpp
PRIVATE secure-tcp-server.cpp
PRIVATE secure-tcp-client.cpp )
# Available in Debian package `libboost-system-dev`.
find_package( Boost CONFIG REQUIRED
COMPONENTS system )
set( THREADS_PREFER_PTHREAD_FLAG ON )
find_package( Threads REQUIRED )
target_link_libraries( secure_tcp_socket
PRIVATE Threads::Threads
PRIVATE Boost::headers
PRIVATE ${AES_LIBRARIES} )
## ============================== ###
## --- secure_tcp-socket_test --- ###
## ============================== ###
add_executable( secure_tcp_socket_test )
set_target_properties( secure_tcp_socket_test
PROPERTIES
CXX_STANDARD 11 )
target_sources( secure_tcp_socket_test
PRIVATE test.cpp )
target_link_libraries( secure_tcp_socket_test
PRIVATE secure_tcp_socket )
add_test( secure-tcp-socket-test secure_tcp_socket_test )
# Copy executable to root of build tree
add_custom_command(
TARGET secure_tcp_socket_test POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_BINARY_DIR}/secure_tcp_socket_test
${CMAKE_BINARY_DIR}/tests/secure-tcp-socket )