【发布时间】:2016-05-11 09:57:44
【问题描述】:
我正在尝试构建一个项目,该项目在 Windows 7 上使用 Myo SDK 和 LeapMotion SDK,并使用 CMake、Qt Creator 和 MinGW 4.9.2 32 位作为编译器。
MyoSDK 工作正常,但我在 CMake 中链接 LeapMotion SDK 时遇到了一些问题。我找到了一个现有的sample CMake file,它说 Windows 部分还没有完成。
这是我的 CMakeLists.txt:
cmake_minimum_required (VERSION 2.6)
project (MyoLeapController)
#set(THALMICLABSMYO_ROOT_DIR "C:/myo-sdk-win-0.9.0")
################## MYO
if(WIN32)
set(THALMICLABSMYO_ROOT_DIR
"${THALMICLABSMYO_ROOT_DIR}"
CACHE
PATH
"Directory to search for the Thalmic Labs Myo SDK")
if(CMAKE_SIZEOF_VOID_P MATCHES "8")
set(_ARCH x86_64)
else()
set(_ARCH x86_32)
endif()
set(_SDKDIR Windows)
find_path(THALMICLABSMYO_INCLUDE_DIR
NAMES myo/libmyo.h
PATHS "${THALMICLABSMYO_ROOT_DIR}/include")
include(FindPackageHandleStandardArgs)
if(CMAKE_SIZEOF_VOID_P MATCHES "8")
find_library(THALMICLABSMYO_LIBRARY
NAMES myo64
PATHS "${THALMICLABSMYO_ROOT_DIR}/lib"
PATH_SUFFIXES "${_SDKDIR}/${_ARCH}")
else()
find_library(THALMICLABSMYO_LIBRARY
NAMES myo32
PATHS "${THALMICLABSMYO_ROOT_DIR}/lib"
PATH_SUFFIXES "${_SDKDIR}/${_ARCH}")
endif()
find_package_handle_standard_args(ThalmicLabsMyo
DEFAULT_MSG
THALMICLABSMYO_LIBRARY
THALMICLABSMYO_INCLUDE_DIR
${_deps_check})
if(THALMICLABSMYO_FOUND)
set(THALMICLABSMYO_LIBRARIES "${THALMICLABSMYO_LIBRARY}")
set(THALMICLABSMYO_INCLUDE_DIRS "${THALMICLABSMYO_INCLUDE_DIR}")
mark_as_advanced(THALMICLABSMYO_ROOT_DIR)
endif()
mark_as_advanced(THALMICLABSMYO_INCLUDE_DIR THALMICLABSMYO_LIBRARY)
endif()
################## LEAP
IF(LEAP_INCLUDE_DIR AND LEAP_LIBRARY)
SET(LEAP_FIND_QUIETLY TRUE)
ENDIF(LEAP_INCLUDE_DIR AND LEAP_LIBRARY)
# Set locations to search
IF(UNIX)
SET(LEAP_INCLUDE_SEARCH_DIRS
/usr/include
/usr/local/include
/opt/leap/include
/opt/leap_sdk/include
/opt/include INTERNAL)
SET(LEAP_LIBRARY_SEARCH_DIRS
/usr/lib
/usr/lib64
/usr/local/lib
/usr/local/lib64
/opt/leap/lib
/opt/leap/lib64
/opt/leap_sdk/lib
/opt/leap_sdk/lib64 INTERNAL)
SET(LEAP_INC_DIR_SUFFIXES PATH_SUFFIXES leap)
ELSE(UNIX)
#WIN32
SET(LEAP_INC_DIR_SUFFIXES PATH_SUFFIXES inc)
SET(LEAP_LIB_DIR_SUFFIXES PATH_SUFFIXES lib)
ENDIF(UNIX)
# Set name of the Leap library to use
IF(APPLE)
SET(LEAP_LIBRARY_NAME libLeap.dylib)
ELSE(APPLE)
IF(UNIX)
SET(LEAP_LIBRARY_NAME libLeap.so)
ELSE(UNIX)
# TODO Different libraries are provided for compile and runtime
SET(LEAP_LIBRARY_NAME libLeap.lib)
ENDIF(UNIX)
ENDIF(APPLE)
IF(NOT LEAP_FIND_QUIETLY)
MESSAGE(STATUS "Checking for Leap")
ENDIF(NOT LEAP_FIND_QUIETLY)
# Search for header files
FIND_PATH(LEAP_INCLUDE_DIR Leap.h
PATHS ${LEAP_INCLUDE_SEARCH_PATHS}
PATH_SUFFIXES ${LEAP_INC_DIR_SUFFIXES})
# Search for library
FIND_LIBRARY(LEAP_LIBRARY ${LEAP_LIBRARY_NAME}
PATHS ${LEAP_LIBRARY_SEARCH_DIRS}
PATH_SUFFIXES ${LEAP_LIB_DIR_SUFFIXES})
SET(LEAP_INCLUDE_DIR ${LEAP_INCLUDE_DIR} CACHE STRING
"Directory containing LEAP header files")
SET(LEAP_LIBRARY ${LEAP_LIBRARY} CACHE STRING "Library name of Leap library")
SET(LEAP_INCLUDE_DIRS ${LEAP_INCLUDE_DIR} )
SET(LEAP_LIBRARIES ${LEAP_LIBRARY} )
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Leap DEFAULT_MSG LEAP_LIBRARY LEAP_INCLUDE_DIR)
MARK_AS_ADVANCED(LEAP_INCLUDE_DIR LEAP_LIBRARY)
##################
message(${LEAP_LIBRARY})
INCLUDE_DIRECTORIES(${THALMICLABSMYO_INCLUDE_DIR} ${LEAP_INCLUDE_DIRS})
add_executable(MyoLeapController main.cpp)
target_link_libraries(MyoLeapController ${THALMICLABSMYO_LIBRARY} ${LEAP_LIBRARY})
我的 CMake 输出是:
C:/LeapSDK/lib/x86/Leap.dll
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/riecker/Documents/Masterthesis/MyoLeapController-bin
我链接找到的 Leap 库与 Myo 完全相同,但我得到了一些链接器错误。
我的 C++ 测试程序:
#include <iostream>
#include <myo/myo.hpp>
#include <Leap.h>
int main (int argc, char *argv[])
{
//myo::Hub hub("MyoLeapController");
Leap::Controller controller;
std::cout << "hi" << std::endl;
return 0;
}
错误信息:
[ 50%] Linking CXX executable MyoLeapController.exe
CMakeFiles\MyoLeapController.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x1d): undefined reference to `Leap::Controller::Controller()'
CMakeFiles\MyoLeapController.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x51): undefined reference to `Leap::Controller::~Controller()'
CMakeFiles\MyoLeapController.dir\build.make:98: recipe for target 'MyoLeapController.exe' failed
CMakeFiles\MyoLeapController.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x61): undefined reference to `Leap::Controller::~Controller()'
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/MyoLeapController.dir/all' failed
makefile:82: recipe for target 'all' failed
C:/Qt/Tools/mingw492_32/bin/../lib/gcc/i686-w64-mingw32/4.9.2/../../../../i686-w64-mingw32/bin/ld.exe: CMakeFiles\MyoLeapController.dir/objects.a(main.cpp.obj): bad reloc address 0x0 in section `.ctors'
collect2.exe: error: ld returned 1 exit status
mingw32-make[2]: *** [MyoLeapController.exe] Error 1
mingw32-make[1]: *** [CMakeFiles/MyoLeapController.dir/all] Error 2
mingw32-make: *** [all] Error 2
10:56:32: Der Prozess "C:\Qt\Tools\mingw492_32\bin\mingw32-make.exe" wurde mit dem Rückgabewert 2 beendet.
Fehler beim Erstellen/Deployment des Projekts MyoLeapController (Kit: Desktop Qt 5.6.0 MinGW 32bit)
Bei der Ausführung von Schritt "Make"
Leap SDK 的包含工作正常,因为它只能在链接期间找到头文件我遇到了问题。对于包含和链接,我对正在运行的 Myo SDK 做同样的事情。
任何人都可以帮助我或对此有想法吗?谢谢
【问题讨论】:
-
对我来说看起来不错。 main.cpp 是您唯一的源文件,还是您还实现了
Leap::Controller类? (以防万一,在哪个文件中?它也应该列在您的 add_executable 命令中) -
不,我只有 main.cpp,如果我遵循 Leap::Controller,我会进入 Leap.h
-
你能删除
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Leap DEFAULT_MSG LEAP_LIBRARY LEAP_INCLUDE_DIR)吗?你能用make VERBOSE=1显示构建(从干净)的输出吗? -
我删除了该行,make VERBOSE=1 输出在这里:pastebin.com/tKLEGxUq
-
您可以尝试使用干净的构建吗?看起来你有一个损坏的目标文件