qt编译错误:找不到架构x86_64的符号

时间:2015-03-27 02:49:02

标签: c++ macos qt compiler-errors

尝试使用Qt 5.4 clang 64bit在mac上编译程序。该程序包括使用Opal Kelly .dylib文件和头文件与通过USB连接的FPGA通信。该程序使用Windows版本的.dylib(.dll)和Windows头文件在Windows上编译正常,但是在mac上我尝试编译时出现以下错误:

:-1: error: symbol(s) not found for architecture x86_64

编译器输出为:

Undefined symbols for architecture x86_64:
  "_okFrontPanelDLL_LoadLib", referenced from:
      MainWindow::AllocateMemory() in ProcessingFunctions.o
  "_okFrontPanelManager_Destruct", referenced from:
      OpalKelly::FrontPanelManager::~FrontPanelManager() in main.o
      OpalKelly::FrontPanelManager::~FrontPanelManager() in fpga.o
      OpalKelly::FrontPanelManager::~FrontPanelManager() in graphing.o
      OpalKelly::FrontPanelManager::~FrontPanelManager() in FPGAScanner.o
      OpalKelly::FrontPanelManager::~FrontPanelManager() in ProcessingFunctions.o
      OpalKelly::FrontPanelManager::~FrontPanelManager() in mainwindow.o
      OpalKelly::FrontPanelManager::~FrontPanelManager() in moc_mainwindow.o
      ...
  "_okFrontPanel_ConfigureFPGA", referenced from:
      OpalKellyLegacy::okCFrontPanel::ConfigureFPGA(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in mainwindow.o
  "_okFrontPanel_Construct", referenced from:
      OpalKellyLegacy::okCFrontPanel::okCFrontPanel() in ProcessingFunctions.o
  "_okFrontPanel_Destruct", referenced from:
      OpalKellyLegacy::okCFrontPanel::~okCFrontPanel() in mainwindow.o
  "_okFrontPanel_GetDeviceCount", referenced from:
      OpalKellyLegacy::okCFrontPanel::GetDeviceCount() in ProcessingFunctions.o
  "_okFrontPanel_GetDeviceID", referenced from:
      OpalKellyLegacy::okCFrontPanel::GetDeviceID() in ProcessingFunctions.o
  "_okFrontPanel_GetSerialNumber", referenced from:
      OpalKellyLegacy::okCFrontPanel::GetSerialNumber() in ProcessingFunctions.o
  "_okFrontPanel_GetWireOutValue", referenced from:
      OpalKellyLegacy::okCFrontPanel::GetWireOutValue(int) in FPGAScanner.o
  "_okFrontPanel_IsFrontPanelEnabled", referenced from:
      OpalKellyLegacy::okCFrontPanel::IsFrontPanelEnabled() in ProcessingFunctions.o
  "_okFrontPanel_LoadDefaultPLLConfiguration", referenced from:
      OpalKellyLegacy::okCFrontPanel::LoadDefaultPLLConfiguration() in mainwindow.o
  "_okFrontPanel_OpenBySerial", referenced from:
      OpalKellyLegacy::okCFrontPanel::OpenBySerial(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in ProcessingFunctions.o
  "_okFrontPanel_ReadFromPipeOut", referenced from:
      OpalKellyLegacy::okCFrontPanel::ReadFromPipeOut(int, long, unsigned char*) in FPGAScanner.o
  "_okFrontPanel_SetWireInValue", referenced from:
      OpalKellyLegacy::okCFrontPanel::SetWireInValue(int, unsigned int, unsigned int) in fpga.o
      OpalKellyLegacy::okCFrontPanel::SetWireInValue(int, unsigned int, unsigned int) in FPGAScanner.o
  "_okFrontPanel_UpdateWireIns", referenced from:
      OpalKellyLegacy::okCFrontPanel::UpdateWireIns() in fpga.o
      OpalKellyLegacy::okCFrontPanel::UpdateWireIns() in FPGAScanner.o
  "_okFrontPanel_UpdateWireOuts", referenced from:
      OpalKellyLegacy::okCFrontPanel::UpdateWireOuts() in FPGAScanner.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [AFE-MP-512.app/Contents/MacOS/AFE-MP-512] Error 1
13:38:18: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project AFE (kit: Clone of Desktop Qt 5.4.0 clang 32bit)
When executing step "Make"
13:38:18: Elapsed time: 00:31.

我知道当没有使用头文件中有SLOT或函数时会发生这种错误,但我不知道如何找到导致问题的原因。

Opal Kelly头文件位于here

如果您需要更多信息,请随时与我们联系。

3 个答案:

答案 0 :(得分:3)

这意味着存在以下问题:

  1. 当您应该链接64位
  2. 时,您正在链接32位dylib
  3. 链接器无法找到库
  4. 或者图书馆中没有所需的符号。
  5. 您可以查看编译器和链接器选项以确保链接库。使用nmstring确保函数库中存在这些函数。

答案 1 :(得分:1)

  

该程序包括使用Opal Kelly .dylib文件和头文件与通过USB连接的FPGA通信....   std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >的未定义符号...

__1表示您正在使用LLVM C ++运行时(libc++)。在某些地方,您可能正在与GNU C ++运行时混合和匹配(libstdc++)。 GNU C ++运行时(libstdc++在其符号中缺少 __1

您应该浏览项目 所有预先构建的库,并确保它们正在使用其中一个库。对于每个,您应该使用(1)CXXFLAGS(LLVM)或(2)-stdlib=libc++(GNU)的-stdlib=libstdc++

请注意,像Xcode这样的IDE可能会使用与Opal Kelly之类的库不同的-stdlib=...设置。在这种情况下,让Xcode与Opal Kelly库匹配,或重建Opal Kelly库以匹配Xcode。


如果感兴趣,__1是用于版本控制的内联命名空间。请参阅What are inline namespaces for?Where does the __1 symbol come from when using LLVM's libc++?

答案 2 :(得分:0)

iphonesimulator:

CONFIG(iphonesimulator, iphoneos | iphonesimulator)
QMAKE_APPLE_SIMULATOR_ARCHS = x86_64 #i386 for 32bit

的iPhoneOS:

CONFIG(iphoneos, iphoneos | iphonesimulator)