我的应用程序依赖于 OpenSSL。因此,我下载并构建了 OpenSSL,并将我需要的静态库(libssl.a
和libcrypto.a
)放在我可以控制的已知目录中。在我的应用程序的 cmake 文件中,我使用find_library
命令来确定每个库的完整路径,将路径存储在列表变量中,然后将该列表变量添加到target_link_libraries
命令中。只要 OpenSSL 符号对我的应用程序可见,那就行得通。
OpenSSL 进一步依赖于“动态链接加载器”库(aka libdl
)。我知道 OpenSSL 构建使用了-ldl
编译器选项,因为我可以在构建输出中看到它。
在我的 Linux 开发机器上,该libdl
库似乎已经安装。证据是:
libdl.so
和libdl.so.2
(它们是实际libdl-2-17.so
库文件的符号链接)存在于似乎是此类事物的标准目录中:/usr/lib64
- 当我运行时
man dlclose
,我得到了有关“动态链接加载器”库的预期手册页。
但是,当我构建我的应用程序时,会出现如下链接器错误。libdl
绝对找不到图书馆。
/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
问题 1
cmake 应该能够自己找到libdl.so
吗?
问题2
在我的应用程序的 cmake 文件中,我可以使用该find_library
命令来确定libdl
库的完整路径,并将该路径添加到target_link_libraries
命令中。请注意,我不必给它一个路径提示。这行得通,但感觉像是一种解决方法。
我是否有必要明确搜索的完整路径libdl.so
?
问题 3
cmake 中是否有更合适的方法来链接“标准”库,例如libdl
?
制作文件
以下是我的应用程序的 cmake 文件的相关片段。
...
#------------------------------
# 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 版本 2.8.12,但特定版本可能并不重要。