My application depends on OpenSSL. So, I downloaded and built OpenSSL, and placed the static libraries (libssl.a and libcrypto.a) I require in known directory I have control over. In my application's cmake file, I use the find_library command to determine the full path of each library, store the paths in a list variable, and add that list variable to the target_link_libraries command. That works, insofar as the OpenSSL symbols are visible to my application.
OpenSSL further depends on the "Dynamic linking loader" library (a.k.a. libdl). I know that the OpenSSL build used the -ldl compiler option because I can see it in the build output.
On my Linux develpment machine, the libdl library seems to have already been installed. The evidence is:
libdl.soandlibdl.so.2(which are symbolic links to the actuallibdl-2-17.solibrary file) exist in what seems to be a standard directory for such things:/usr/lib64- When I run
man dlclose, I get the expected manual page about the "Dynamic linking loader" library.
However, when I build my application, I get linker errors like the following. The libdl library is definitely not being found.
/usr/bin/ld: ../install/lib/libcrypto.a(dso_dlfcn.o): undefined reference to symbol 'dlclose@@GLIBC_2.2.5' /usr/lib64/libdl.so.2: error adding symbols: DSO missing from command line Question 1
Should cmake have been able to find libdl.so on its own?
Question 2
In my application's cmake file, I can use the find_library command to determine the full path of the libdl library, and add that path to the target_link_libraries command. Notice that I did not have to give it a path hint. That works, but it feels like a workaround.
Should it be necessary for me to explicitly search for the full path of libdl.so?
Question 3
Is there a more proper way in cmake to link with a "standard" library such as libdl?
cmake file
The following are the relevant snippets of my application's cmake file.
... #------------------------------ # Search for openssl libraries. set( OPENSSL_LIBRARIES ) find_library( temp libssl.a PATHS "${CMAKE_SOURCE_DIR}/3rd_party/" ) list( APPEND OPENSSL_LIBRARIES ${temp} ) unset( temp CACHE ) find_library( temp libcrypto.a PATHS "${CMAKE_SOURCE_DIR}/3rd_party/" ) list( APPEND OPENSSL_LIBRARIES ${temp} ) unset( temp CACHE ) #------------------------------ # Search for dl library. # TODO: Is this workaround really necessary? find_library( DL_LIBRARY libdl.so ) ... #------------------------------ # My application. add_executable( myapp main.cxx ) set_target_properties( myapp PROPERTIES COMPILE_FLAGS "-g" ) target_link_libraries( myapp ${OPENSSL_LIBRARIES} # TODO: Is this workaround really necessary? ${DL_LIBRARY} ) install( TARGETS myapp DESTINATION ${BIN_INSTALL_DIR} ) cmake version
I am using cmake version 2.8.12, but the particular version may not be important.
find_library(). Did you try just usingtarget_link_libraries(myapp ${OPENSSL_LIBRARIES} dl)?dllibrary.${CMAKE_DL_LIBS}variable to thetarget_link_librariesclause. The value of that variable isdl. That works, and it is more appropriate that usingfind_libraryto determine the path of that library myself.