我正在使用libkml構建一個大型應用程序。我從這裏使用libkml的cmake端口:https://github.com/rashadkm/libkml獲取未定義的參考錯誤,但nm顯示符號存在
我得到一個奇怪的未定義的符號錯誤引用,即使認爲該符號似乎被引用和定義。
這是make命令:
/usr/bin/c++ -fPIC -Werror=return-type -Werror=return-type -Wall
-Werror=parentheses -Werror=uninitialized -Werror=missing-braces
-fPIC -O0 -Wall -fPIC -fvisibility=hidden -fno-strict-aliasing
-Wno-long-long -m64 -g -D_DEBUG --coverage -Wl,-Bsymbolic -Wl,--
no-undefined -shared -o GPS2KML.plb CMakeFiles/GPS2KML.dir
/gps.cpp.o CMakeFiles/GPS2KML.dir/kml.cpp.o CMakeFiles/GPS2KML.dir
/stdafx.cpp.o /trunk/src/filter/GPS2KML/external/libkml/lib/cmake
/libkml/../../libkmlconvenience.so.1.3.1 /trunk/src/filter/GPS2KML
/external/libkml/lib/cmake/libkml/../../libkmlengine.so.1.3.1
/trunk/src/filter/GPS2KML/external/libkml/lib/cmake/libkml/../..
/libkmldom.so.1.3.1 /trunk/src/filter/GPS2KML/external/libkml
/lib/cmake/libkml/../../libkmlbase.so.1.3.1 -lminizip -luriparser
-lexpat
的化妝輸出:
CMakeFiles/GPS2KML.dir/kml.cpp.o: In function `cKML::~cKML()':
/trunk/src/filter/GPS2KML/src/kml.cpp:55: undefined reference to `*kmldom::SerializePretty(boost::intrusive_ptr<kmldom::Element> const&)*'
collect2: error: ld returned 1 exit status
現在,如果我這樣做: 丹尼亞爾@丹尼亞爾-的Inspiron-5521:/ $納米--demangle - -extern-only --defined-only ../trunk/src/filter/GPS2KML/external/libkml/lib/libkmldom.so | grep的SerializePretty
它清楚地表明:
000000000013c9aa T kmldom::SerializePretty[abi:cxx11](boost::intrusive_ptr<kmldom::Element> const&)
現在我不明白是什麼問題。我有檢查計算器對此中存在的問題,我發現了存在的問題四種解決方案:
- 在某些情況下,demangled符號名稱不與已導致錯誤的符號匹配。這顯然不是我的情況。
- 在放入.o文件的名稱後,在命令末尾使用-llibrary。因此,當鏈接器遇到庫時,庫中存在未定義的符號。對於我來說,這顯然不是解決方案,因爲我在圖書館結束時提供了圖書館。
- 在某些情況下,符號存在於共享庫中,但沒有外部鏈接或未定義。這可以通過使用帶有--extern-only和--defined-only的nm來確認。因此這對我來說也不是解決方案。
編輯: 附加信息:
這是我使用的cmake的文件:
find_package(LibKML REQUIRED)
include_directories(${LIBKML_INCLUDE_DIRS})
add_filter(${PROJECT}
gps.h
gps.cpp
kml.h
kml.cpp
#can2gps.h
#can2gps.cpp
stdafx.h
stdafx.cpp)
target_link_libraries (${PROJECT} ${LIBKML_LIBRARIES})
的add_filter大致翻譯這個宏:
add_library(${NAME} MODULE ${ARGN} ${${NAME}_MOC} ${${NAME}_UI} ${${NAME}_QRC})
target_link_libraries(${NAME} ${BUILD_LIBS} ${QT_LIBRARIES} ${ADTF_OPENGL_LIBRARY} ${ADTF_ADDITIONAL_UTILS_LIBS})
set_target_properties(${NAME}
PROPERTIES
SUFFIX ".plb"
)
if(UNIX)
set_target_properties(${NAME}
PROPERTIES
PREFIX ""
)
鏈接的順序很重要...您必須先與依賴者鏈接,然後依賴鏈接。如果您有循環引用,則可能需要多次鏈接到庫 – UKMonkey
另一種可能性是,名稱demangling不知何故模糊了某些內容。試試'nm --extern-only --defined-only | egrep'kmldom。* Serialize。* boost。* intrusive_ptr。* kmldom。* Element''然後看看你能否看到精確的損壞符號。也許這個符號是針對不同的ABI版本的。 – Omnifarious
@Omnifarious在運行你的命令時,沒有產生輸出。 –