我正在编译&在Linux中链接OPC UA源代码,使用CMake构建二进制文件。 在链接时,我收到以下错误:
/bin/linux/xxx/Debug/libxx.so: undefined reference to
`CRYPTO_free@OPENSSL_1.0.0' /bin/linux/xxx/Debug/libxx.so: undefined
reference to `i2d_X509@OPENSSL_1.0.0'
它引用自定义库(/ opt / lib /)路径中存在的SSL,加密库。
要解决此错误,我尝试了
1)我还在链接器标志中添加了/ opt / lib:
SET(GCC_COVERAGE_LINK_FLAGS "-L/opt/lib/ -lssl -lcrypto -ldl -lrt ")
add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})
SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}" )
2)我还在link_directories中添加了ssl和crypto库路径:
set (OPENSSL_LIBRARY_DIRS /opt/lib)
link_directories(${OPENSSL_LIBRARY_DIRS})
我仍然遇到相同的链接器问题。
在/opt/lib/
下,libssl.so
和libcrypto.so
可用。
通过添加ssl和crypto库,我能够成功编译链接并运行使用CRYPTO_free()
函数的示例Qt项目。
但我想知道如何使它与CMake一起使用。
注意:我使用的是cmake版本3.3.0-rc3版本。
答案 0 :(得分:0)
如果可能,您应该使用find_package(OpenSSL)
并使用生成的OPENSSL _...变量,而不是硬编码库名称和搜索路径。您可以在调用find_package
之前设置OPENSSL_ROOT_DIR,告诉模块在哪里搜索OpenSSL。
https://cmake.org/cmake/help/v3.0/module/FindOpenSSL.html
如果您正在为另一个目标进行交叉编译,那么您应该尝试使用工具链文件来告诉CMake一般在哪里查找包含和库。
https://cmake.org/cmake/help/v3.0/manual/cmake-toolchains.7.html