2015-07-21 298 views
0

我編譯&鏈接在Linux中使用CMake的OPC UA源代碼來構建二進制文件。 連接時,我得到了下面的錯誤:CMake鏈接器錯誤與SSL庫

/bin/linux/xxx/Debug/libxx.so: undefined reference to 
`[email protected]_1.0.0' /bin/linux/xxx/Debug/libxx.so: undefined 
reference to `[email protected]_1.0.0' 

是闖民宅SSL,加密庫中存在的自定義庫(的/ opt/lib中/)路徑。

要解決這個錯誤,我試過

1)我增加了/在連接器選項還可以選擇/ 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)我還添加了SSL和密碼庫路徑link_directories:

set (OPENSSL_LIBRARY_DIRS /opt/lib) 

link_directories(${OPENSSL_LIBRARY_DIRS}) 

仍然我得到相同的鏈接器問題。

/opt/lib/libssl.solibcrypto.so可用。 我能夠成功地編譯鏈接並運行使用CRYPTO_free()函數的示例Qt項目,方法是添加ssl和加密庫。 但我想知道如何使它與CMake一起工作。

注意:我正在使用cmake版本3.3.0-rc3版本。

+1

不要添加鏈接的標誌一樣, - CMake的不是GNU製作,使用適合(http://www.cmake.org/cmake/help/v3.2/command/find_library .html)[命令](http://www.cmake.org/cmake/help/v3.2/command/target_link_libraries.html)。運行'make'時設置'VERBOSE = 1'環境變量並檢查命令行。如果有不正確的地方,請相應地調整您的CMake文件。您目前的問題非常模糊,在不瞭解其他細節的情況下很難提供更具體的建議。 – ComicSansMS

+0

嗨感謝您的回覆。最後,我通過向CMAKE_LIBRARY_PATH添加SSL庫路徑來解決此問題。 [實際上,我們正在定製buildroot,其中存在SSL庫。]在此find_package()能夠識別SSL安裝之後。 –

回答

0

如果可能,應該使用find_package(OpenSSL)並使用生成的OPENSSL _...變量,而不是硬編碼庫名稱和搜索路徑。在調用find_package來告訴模塊在哪裏搜索OpenSSL之前,您可以設置OPENSSL_ROOT_DIR。

https://cmake.org/cmake/help/v3.0/module/FindOpenSSL.html

如果你是交叉編譯的另一個目標,你應該嘗試使用工具鏈文件,告訴CMake的地方尋找包括與一般的圖書館。

https://cmake.org/cmake/help/v3.0/manual/cmake-toolchains.7.html