7

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:

  1. libdl.so and libdl.so.2 (which are symbolic links to the actual libdl-2-17.so library file) exist in what seems to be a standard directory for such things: /usr/lib64
  2. 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.

3
  • 1
    If this library is installed in the standard location (which it looks like it is), you should not need find_library(). Did you try just using target_link_libraries(myapp ${OPENSSL_LIBRARIES} dl)? Commented Nov 7, 2019 at 2:20
  • 1
    In short: When you link openssl statically, you need to manually link all libraries it depends, including dl library. Commented Nov 7, 2019 at 7:59
  • 1
    Thank you @squareskittles and @Tsyvarev for the useful comments and links to duplicate questions. One of the other linked questions mentions adding the ${CMAKE_DL_LIBS} variable to the target_link_libraries clause. The value of that variable is dl. That works, and it is more appropriate that using find_library to determine the path of that library myself. Commented Nov 7, 2019 at 15:21

0

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.