2017-06-17 34 views
0

我在使用RTI DDS庫的Qt Creator(基於Qt 5.8)中有一個簡單的項目。我的項目是,成功構建並在Qt中通過qmake鏈接作爲工具構建。將qmake轉換爲cmake時的鏈接錯誤

現在我想用cmake構建工具來構建我的項目。所以我寫了下面的CmakeLists.txt。但是我收到RTI庫的鏈接錯誤。我帶來了qmake和cmake文件。請告訴我我做錯了什麼;

QMAKE(.pro文件):

QT += core 
QT -= gui 

DEFINES += "_GLIBCXX_USE_CXX11_ABI=0" 
QMAKE_CXXFLAGS+=-std=c++11 

TARGET = untitled 
CONFIG += console 
CONFIG -= app_bundle 

TEMPLATE = app 

SOURCES += main.cpp \ 
    datawriter.cpp \ 
    ../../../Repositories/tests/r.karimi/Publisher/data/IDLs/myIDL/myIDL.cxx \ 
    ../../../Repositories/tests/r.karimi/Publisher/data/IDLs/myIDL/myIDLImpl.cxx \ 
    ../../../Repositories/tests/r.karimi/Publisher/data/IDLs/myIDL/myIDLImplPlugin.cxx 

HEADERS += \ 
    datawriter.h \ 
    ../../../Repositories/tests/r.karimi/Publisher/data/IDLs/myIDL/myIDL.hpp \ 
    ../../../Repositories/tests/r.karimi/Publisher/data/IDLs/myIDL/myIDLImpl.h \ 
    ../../../Repositories/tests/r.karimi/Publisher/data/IDLs/myIDL/myIDLImplPlugin.h 


QMAKE_CXXFLAGS += -DRTI_UNIX 
QMAKE_CXXFLAGS += -DRTI_LINUX 
QMAKE_CXXFLAGS += -DRTI_64BIT 

unix:LIBS += -L$$(NDDSHOME)/lib/x64Linux3gcc4.8.2 -lnddscd -lnddscored -lnddscpp2d -lrtidlcppd -lrtirsinfrastructured 
INCLUDEPATH += .. \ 
       $$(NDDSHOME)/include/ndds/hpp \ 
       $$(NDDSHOME)/include \ 
       $$(NDDSHOME)/include/ndds \ 
       $$(NDDSHOME)/include/persistence \ 
       ../../../Repositories/tests/r.karimi/Publisher/data/IDLs/myIDL \ 

的CMakeLists.txt

cmake_minimum_required(VERSION 3.7) 
project(Publisher) 

set(CMAKE_AUTOMOC ON) 
set(CMAKE_AUTORCC ON) 
set(CMAKE_CXX_STANDARD 11) 
set(CMAKE_INCLUDE_CURRENT_DIR ON) 
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) 

# Add RTI flags: 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRTI_UNIX") 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRTI_LINUX") 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRTI_64BIT") 

macro(add_idl_files LIBNAME) 
    include_directories($ENV{HOME}/tests/r.karimi/Publisher/data/IDLs/${LIBNAME}) 
    list(APPEND SOURCE_FILES $ENV{HOME}/tests/r.karimi/Publisher/data/IDLs/${LIBNAME}/${LIBNAME}.cxx) 
    list(APPEND SOURCE_FILES $ENV{HOME}/tests/r.karimi/Publisher/data/IDLs/${LIBNAME}/${LIBNAME}Impl.cxx) 
    list(APPEND SOURCE_FILES $ENV{HOME}/tests/r.karimi/Publisher/data/IDLs/${LIBNAME}/${LIBNAME}ImplPlugin.cxx) 
    list(APPEND HEADER_FILES $ENV{HOME}/tests/r.karimi/Publisher/data/IDLs/${LIBNAME}/${LIBNAME}.hpp) 
    list(APPEND HEADER_FILES $ENV{HOME}/tests/r.karimi/Publisher/data/IDLs/${LIBNAME}/${LIBNAME}Impl.h) 
    list(APPEND HEADER_FILES $ENV{HOME}/tests/r.karimi/Publisher/data/IDLs/${LIBNAME}/${LIBNAME}ImplPlugin.h) 
endmacro() 

set(SOURCE_FILES src/main.cpp src/DataWriter.cpp) 
set(HEADER_FILES include/DataWriter.h) 

include_directories(
     include 
     # RTI 
     $ENV{NDDSHOME}/include 
     $ENV{NDDSHOME}/include/ndds 
     $ENV{NDDSHOME}/include/ndds/hpp 
     $ENV{NDDSHOME}/include/persistence 
) 

# Add DDS Libs 
add_idl_files(myIDL) 

set(
     LIBS 
     #RTI 
     nddscd 
     nddscored 
     nddscpp2d 
     rtidlcppd 
     rtirsinfrastructured 
) 

link_directories(
     $ENV{NDDSHOME}/lib/x64Linux3gcc4.8.2 
) 
set(CMAKE_VERBOSE_MAKEFILE ON) 

add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${HEADER_FILES}) 
target_link_libraries(${PROJECT_NAME} ${LIBS}) 

鏈接錯誤:

.../libnddscored.so: undefined reference to `dlopen' 
.../libnddscored.so: undefined reference to `dlclose' 
.../libnddscored.so: undefined reference to `dlerror' 
.../libnddscored.so: undefined reference to `dlsym' 

在此先感謝您的幫助。 禮

+1

可能重複[需要鏈接cmake項目到dl庫](https://stackoverflow.com/questions/33678965/need-to-link-cmake-project-to-dl-library) – Tsyvarev

回答

1
.../libnddscored.so: undefined reference to `dlopen' 
.../libnddscored.so: undefined reference to `dlclose' 
.../libnddscored.so: undefined reference to `dlerror' 
.../libnddscored.so: undefined reference to `dlsym' 

這些符號在-ldl定義。只需將${CMAKE_DL_LIBS}添加到target_link_libraries()即可。