2013-05-15 226 views
3

因此,我正在嘗試爲學校編寫一個小程序,其中一部分需要使用cmake。我有兩個不同的類包含在他們自己的文件中,我將它們用作主類的一部分。我已經包括了頭這樣在主項目標題:'undefined reference to'with cmake

#include /path/to/header/1.h 
#include /path/to/header/2.h 

我的問題是,當我運行make我已經運行cmake後,我獲得的任何實例未定義引用錯誤中,我嘗試使用兩個庫中的一個。我知道它與鏈接器錯誤有關,但由於我是cmake新手,我不確定使用TARGET_LINK_LIBRARIES的正確方法是什麼。

編輯

後連接/將我的圖書館,我有以下幾點:

的CMakeLists.txt:

# A name for the project 
project(plasma-engine-gdrive) 

# Find the required libaries 
find_package(KDE4 REQUIRED) 
include(KDE4Defaults) 

add_definitions (${QT_DEFINITIONS} ${KDE4_DEFINITIONS}, -std=c++0x) 
include_directories(
    ${CMAKE_SOURCE_DIR} 
    ${CMAKE_BINARY_DIR} 
    ${KDE4_INCLUDES} 
    ./include 
    ./lib 
    ) 

set (GOOGLE_LIBS include/atom_helper.h include/util/string_utils.h include/client/doc_list_service.h include/client/service.h) 
set (GOOGLE_SRCS include/atom_helper.cc include/util/string_utils.cc include/client/doc_list_service.cc include/client/service.cc) 

# We add our source code here 
set(gdrive_engine_SRCS gdriveengine.cpp) 

add_library (DataWrapper include/DataWrapper.cpp include/DataWrapper.h) 
add_library (GData ${GOOGLE_SRCS} ${GOOGLE_LIBS}) 

# Now make sure all files get to the right place 
kde4_add_plugin(plasma_engine_gdrive ${gdrive_engine_SRCS}) 
target_link_libraries(plasma_engine_gdrive 
         GData 
         DataWrapper 
         ${KDE4_KDECORE_LIBS} 
         ${KDE4_PLASMA_LIBS}) 

install(TARGETS plasma_engine_gdrive 
     DESTINATION ${PLUGIN_INSTALL_DIR}) 

install(FILES plasma-engine-gdrive.desktop 
     DESTINATION ${SERVICES_INSTALL_DIR}) 

也有太多的錯誤放到這裏。這裏有幾個:

/usr/include/c++/4.6/bits/stl_map.h:467: undefined reference to `Glib::ustring::ustring()' 
lib/libGData.a(atom_helper.o): In function `pair<Glib::ustring, Glib::ustring, void>': 
/usr/include/c++/4.6/bits/stl_pair.h:132: undefined reference to `Glib::ustring::ustring(Glib::ustring const&)' 
/usr/include/c++/4.6/bits/stl_pair.h:132: undefined reference to `Glib::ustring::ustring(Glib::ustring const&)' 
lib/libGData.a(atom_helper.o): In function `pair<Glib::ustring, Glib::ustring>': 
/usr/include/c++/4.6/bits/stl_pair.h:137: undefined reference to `Glib::ustring::ustring(Glib::ustring const&)' 
/usr/include/c++/4.6/bits/stl_pair.h:137: undefined reference to `Glib::ustring::ustring(Glib::ustring const&)' 
+2

這是你實際編寫'#include'指令的方式嗎?不像'#include「/path/to/header/1.h」'(注意路徑中的引號)? –

+2

當我聽到小程序時,我聽到java – SNce

+0

的實際示例,或許 –

回答

8

我正在和其他人一起工作,我把它編譯了!

我真正需要的是提供庫的名稱,並把它變成target_link_libraries像這樣:

target_link_libraries(plasma_engine_gdrive 
         DataWrapper 
         GData 
         xml++-2.6 
         curl 
         glibmm-2.4 
         ${KDE4_KDECORE_LIBS} 
         ${KDE4_PLASMA_LIBS}) 

我爸爸,是與CMake的完全陌生,去和CMake的內翻出link.txt建設結構體。在那裏,他剛添加的-o標誌後執行以下操作:

-lxml++-2.6 
-lcurl 
-lglibmm-2.4 

當我看到,我想我可能會嘗試這樣做,通過連接的CMakeLists.txt - 和它的工作。