2017-07-19 84 views
0

有一個項目,在構建項目時存在鏈接庫到項目的問題。 如果有人告訴我如何解決這個問題,我將非常感激。 據我瞭解問題是在圖書館的正確位置。所以,當建立與它正確鏈接的項目。與CMAKE中的自定義外部庫鏈接

這是項目文件CmakeList

cmake_minimum_required(VERSION 3.5.1) 
project(maintenance) 

set(CMAKE_CXX_STANDARD 11) 
set(CMAKE_AUTOMOC ON) 
set(CMAKE_AUTORCC ON) 
set(CMAKE_AUTOUIC OFF) 
set(CMAKE_INCLUDE_CURRENT_DIR ON) 
#set(CMAKE_VERBOSE_MAKEFILE ON) 

find_package(Qt5Widgets REQUIRED) 
find_package(Qt5Core REQUIRED) 
find_package(Qt5Gui REQUIRED) 
find_package(Qt5Charts REQUIRED) 
find_package(Qt5Xml REQUIRED) 
find_package(Qt5Network REQUIRED) 

include_directories(../../088) 

#include(FindPackageHandleStandardArgs) 
#find_library(Network_LIBRARY NAMES NetworkCommunication PATHS ../../088/build-libs-ubuntu-Release) 
#find_package_handle_standard_args(Network DEFAULT_MSG Network_LIBRARY) 

add_library(NetworkCommunication SHARED IMPORTED) 
set_property(TARGET NetworkCommunication PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/../../088/build-libs-ubuntu-Release/libNetworkCommunication.so) 
set(Network_LIBRARY NetworkCommunication) 

#link_directories(${CMAKE_CURRENT_LIST_DIR}/../../088/build-libs-ubuntu-Release) 

qt5_add_resources(RCC_RESOURCES resources.qrc) 

file(GLOB SOURCE_FILES_2 
     ${CMAKE_CURRENT_SOURCE_DIR}/cop/*.h 
     ${CMAKE_CURRENT_SOURCE_DIR}/cop/*.cpp 
     ${CMAKE_CURRENT_SOURCE_DIR}/curves/*.h 
     ${CMAKE_CURRENT_SOURCE_DIR}/curves/*.cpp 
     ${CMAKE_CURRENT_SOURCE_DIR}/curves/shapes/*.h 
     ${CMAKE_CURRENT_SOURCE_DIR}/curves/shapes/*.cpp 
     ${CMAKE_CURRENT_SOURCE_DIR}/general/*.h 
     ${CMAKE_CURRENT_SOURCE_DIR}/general/*.cpp 
     ${CMAKE_CURRENT_SOURCE_DIR}/load_cells/*.h 
     ${CMAKE_CURRENT_SOURCE_DIR}/load_cells/*.cpp 
     ${CMAKE_CURRENT_SOURCE_DIR}/motors/*.h 
     ${CMAKE_CURRENT_SOURCE_DIR}/motors/*.cpp 
     ${CMAKE_CURRENT_SOURCE_DIR}/passive_mode/*.h 
     ${CMAKE_CURRENT_SOURCE_DIR}/passive_mode/*.cpp 
     ${CMAKE_CURRENT_SOURCE_DIR}/settings/*.h 
     ${CMAKE_CURRENT_SOURCE_DIR}/settings/*.cpp 
     ${CMAKE_CURRENT_SOURCE_DIR}/system/*.h 
     ${CMAKE_CURRENT_SOURCE_DIR}/system/*.cpp 
     ${CMAKE_CURRENT_SOURCE_DIR}/../Gener095/Messages/*.h 
     ${CMAKE_CURRENT_SOURCE_DIR}/../Gener095/Messages/*.cpp 
     ) 

set(SOURCE_FILES 
     Error.cpp 
     Error.hpp 
     main.cpp 
     MainWindow.cpp 
     MainWindow.h 
     NetworkCommunicator.cpp 
     NetworkCommunicator.h 
     Utils.cpp 
     Utils.h 
     ITab.h 
     ) 

add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${SOURCE_FILES_2} ${RCC_RESOURCES}) 

#target_link_libraries(${PROJECT_NAME} ${Network_LIBRARY}) 
target_link_libraries(${PROJECT_NAME} NetworkCommunication) 
target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::Core Qt5::Gui Qt5::Charts Qt5::Xml Qt5::Network) 

include(../../088/BuildUtilities/scripts/lib_setup.cmake) 

和日誌有錯誤

... 
[ 95%] Building CXX object CMakeFiles/maintenance.dir/qrc_resources.cpp.o 
[ 97%] Building CXX object CMakeFiles/maintenance.dir/maintenance_autogen/moc_compilation.cpp.o 
[100%] Linking CXX executable maintenance 
CMakeFiles/maintenance.dir/MainWindow.cpp.o: In function `MainWindow::MainWindow(QMainWindow*)': 
/media/blinct/free1/QtProjects/Applications/095/maintenance/MainWindow.cpp:74: undefined reference to `TenzGraphTab::TenzGraphTab(QWidget*)' 
CMakeFiles/maintenance.dir/maintenance_autogen/moc_compilation.cpp.o: In function `AngleSensors::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)': 
/media/blinct/free1/QtProjects/Applications/095/maintenance/cmake-build-debug/maintenance_autogen/ECUKZBRF6L/moc_AngleSensors.cpp:92: undefined reference to `AngleSensors::OnSetNullPosition()' 
/media/blinct/free1/QtProjects/Applications/095/maintenance/cmake-build-debug/maintenance_autogen/ECUKZBRF6L/moc_AngleSensors.cpp:93: undefined reference to `AngleSensors::OnResetAccel()' 
/media/blinct/free1/QtProjects/Applications/095/maintenance/cmake-build-debug/maintenance_autogen/ECUKZBRF6L/moc_AngleSensors.cpp:94: undefined reference to `AngleSensors::OnDataReceived(QString, QMap<QString, QVariant>)' 
/media/blinct/free1/QtProjects/Applications/095/maintenance/cmake-build-debug/maintenance_autogen/ECUKZBRF6L/moc_AngleSensors.cpp:95: undefined reference to `AngleSensors::OnHandleUp()' 
/media/blinct/free1/QtProjects/Applications/095/maintenance/cmake-build-debug/maintenance_autogen/ECUKZBRF6L/moc_AngleSensors.cpp:96: undefined reference to `AngleSensors::OnHandleDown()' 
/media/blinct/free1/QtProjects/Applications/095/maintenance/cmake-build-debug/maintenance_autogen/ECUKZBRF6L/moc_AngleSensors.cpp:97: undefined reference to `AngleSensors::OnHandleReleased()' 
/media/blinct/free1/QtProjects/Applications/095/maintenance/cmake-build-debug/maintenance_autogen/ECUKZBRF6L/moc_AngleSensors.cpp:98: undefined reference to `AngleSensors::OnHandleTimer()' 
CMakeFiles/maintenance.dir/maintenance_autogen/moc_compilation.cpp.o:(.data.rel.ro._ZTV17AngleSensorColumn[_ZTV17AngleSensorColumn]+0x28): undefined reference to `AngleSensorColumn::~AngleSensorColumn()' 
CMakeFiles/maintenance.dir/maintenance_autogen/moc_compilation.cpp.o:(.data.rel.ro._ZTV17AngleSensorColumn[_ZTV17AngleSensorColumn]+0x30): undefined reference to `AngleSensorColumn::~AngleSensorColumn()' 
CMakeFiles/maintenance.dir/maintenance_autogen/moc_compilation.cpp.o:(.data.rel.ro._ZTV17AngleSensorColumn[_ZTV17AngleSensorColumn]+0x1c0): undefined reference to `non-virtual thunk to AngleSensorColumn::~AngleSensorColumn()' 
CMakeFiles/maintenance.dir/maintenance_autogen/moc_compilation.cpp.o:(.data.rel.ro._ZTV17AngleSensorColumn[_ZTV17AngleSensorColumn]+0x1c8): undefined reference to `non-virtual thunk to AngleSensorColumn::~AngleSensorColumn()' 
../../../088/build-libs-ubuntu-Release/libNetworkCommunication.so: undefined reference to `BtlSerialPortImpl::setRequestToSend(bool)' 
../../../088/build-libs-ubuntu-Release/libNetworkCommunication.so: undefined reference to `g_sVersion_NetworkCommunication' 
../../../088/build-libs-ubuntu-Release/libNetworkCommunication.so: undefined reference to `BtlUdpSocketImpl::writeDatagram(QByteArray const&, QHostAddress const&, unsigned short)' 
../../../088/build-libs-ubuntu-Release/libNetworkCommunication.so: undefined reference to `BtlTcpServerImpl::isListening() const' 
../../../088/build-libs-ubuntu-Release/libNetworkCommunication.so: undefined reference to `BtlFileImpl::close()' 
../../../088/build-libs-ubuntu-Release/libNetworkCommunication.so: undefined reference to `BtlTcpServerImpl::hasPendingConnections() const' 
../../../088/build-libs-ubuntu-Release/libNetworkCommunication.so: undefined reference to `BtlTcpSocketImpl::connectToHost(QHostAddress const&, unsigned short)' 
... 
../../../088/build-libs-ubuntu-Release/libNetworkCommunication.so: undefined reference to `BtlUdpSocketImpl::readDatagram(char*, long long, QHostAddress*, unsigned short*)' 
../../../088/build-libs-ubuntu-Release/libNetworkCommunication.so: undefined reference to `BtlTcpServerImpl::close()' 
collect2: error: ld returned 1 exit status 
CMakeFiles/maintenance.dir/build.make:936: recipe for target 'maintenance' failed 
make[3]: *** [maintenance] Error 1 
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/maintenance.dir/all' failed 
make[2]: *** [CMakeFiles/maintenance.dir/all] Error 2 
CMakeFiles/Makefile2:79: recipe for target 'CMakeFiles/maintenance.dir/rule' failed 
make[1]: *** [CMakeFiles/maintenance.dir/rule] Error 2 
Makefile:118: recipe for target 'maintenance' failed 
make: *** [maintenance] Error 2 

在此先感謝。 很長一段時間,我不明白如何解決這個問題。

+0

你想編譯並鏈接到'NetworkCommunication'或者它已經安裝嗎? – Stewart

+0

我編譯了NetworkCommunication庫,但是我無法將它鏈接到我的項目。 –

+0

'據我瞭解問題是在庫的正確位置。 - 鏈接器**找到**庫,但庫沒有定義給定的符號(標記爲「未定義的引用」)。可能你需要一些其他庫來鏈接。但是,如果沒有關於圖書館及其代碼的意圖的知識,就不可能提出明確的建議。 – Tsyvarev

回答

0

如果NetworkCommunication是你已經編寫並已經安裝的東西,那麼考慮在包中包含一個FindNetworkCommunication.cmake文件。該文件應包含的方法尋找NetworkCommunication像這樣:

# Sets NetworkCommunication_FOUND if found. 
# 
# If NetworkCommunication_FOUND is TRUE, then the following variables are also 
# set: 
# 
# NetworkCommunication_LIBRARY  - Full path to library to link 
# NetworkCommunication_INCLUDE_DIR - Path to include directory 
# 
# $NetworkCommunicationDIR is an environment variable that would correspond to the 
# ./configure --prefix=$NetworkCommunicationDIR used in building NetworkCommunication. 
# 

find_path(NetworkCommunication_INCLUDE_DIR NetworkCommunication.h 
    HINTS 
    ENV NetworkCommunicationDIR 
    PATH_SUFFIXES include/NetworkCommunication include/NetworkCommunication include 
    PATHS 
    /opt/local 
    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Alexey\\NetworkCommunication\\1.00.0000;InstallDir] 
) 

if(CMAKE_SIZEOF_VOID_P EQUAL 8) 
    set(_NetworkCommunication_ARCH_DIR libs/Win64) 
else() 
    set(_NetworkCommunication_ARCH_DIR libs/Win32) 
endif() 

find_library(NetworkCommunication_LIBRARY 
    NAMES NetworkCommunication 
    HINTS 
    ENV NetworkCommunicationDIR 
    PATH_SUFFIXES lib64 lib libs64 libs ${_NetworkCommunication_ARCH_DIR} 
    PATHS 
    /opt/local 
    [HKEY_LOCAL_MACHINE\\SOFTWARE\\Alexey\\NetworkCommunication\\1.00.0000;InstallDir] 
) 

unset(_NetworkCommunication_ARCH_DIR) 

include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) 
FIND_PACKAGE_HANDLE_STANDARD_ARGS(NetworkCommunication DEFAULT_MSG NetworkCommunication_LIBRARY NetworkCommunication_INCLUDE_DIR) 
mark_as_advanced(NetworkCommunication_LIBRARY NetworkCommunication_INCLUDE_DIR) 

複製FindNetworkCommunication.cmake到cmake的安裝的模塊文件夾(/usr/share/cmake-3.8/Modules)或將其複製到本地文件夾,包括${CMAKE_MODULES_PATH}路徑到該文件夾​​。

接下來,在你的CMakeLists.txt文件的維護項目添加以下後add_executable

Find_Package(NetworkCommunication REQUIRED) 
if (NetworkCommunication_FOUND) 
    target_include_directories(${PROJECT_NAME} ${NetworkCommunication_INCLUDE_DIR}) 
    target_link_libraries(${PROJECT_NAME} ${NetworkCommunication_LIBRARY}) 
endif (NetworkCommunication_FOUND) 

這是一個很好的解決方案,如果NetworkCommunication是用於通過維護但你一個獨立的庫打算也讓其他幾家圖書館也使用它。如果NetworkCommunication是與維護相同的項目解決方案的一部分,並且實際上只是要連接到一個項目,那麼可能有更簡單的解決方案。

0

在maintenance.pro爲Qt Creator的,我有這個鏈接,這個庫

U_LIB_DIR_PREFIX += ../../088/build-libs 
U_LIBS += NetworkCommunication 

有另一個項目很多類似的庫和我聯繫喜歡

U_LIBS += NetworkCommunication \ 
    Logging \ 
    UnitController \ 
    TherapyRunnersController \ 
    GenersControllerCommon 

所有這些庫的建立動態庫。在此之後,我將這些庫鏈接到項目。

0

也許有另一種方式如何將庫鏈接到項目?

因爲如果你從QtCreator項目文件maintenance.pro比較這選項

U_LIB_DIR_PREFIX += ../../088/build-libs-ubuntu-Release 
U_LIBS += NetworkCommunication 

,並和寫作各庫模塊,事實證明很奇怪,難與2號線的比較*的.pro