簡體   English   中英

在Mac上編譯動態庫:ld:找不到架構x86_64的符號

[英]compiling dynamic library on Mac: ld: symbol(s) not found for architecture x86_64

我正在編譯SCIP動態庫。 SCIP是用C實現的,我們的優化項目全部是Java,因此我們想使用JNA來訪問它。 我們已經編寫了一個C ++包裝器來構建動態庫,但是在Mac(運行Yosemite 10.10.2)上編譯時遇到了問題。 這是我的gcc和g ++版本:

> gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix
> g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix

我們正在使用CMake(3.2.1版)來構建項目。 這是我們的主要CMakeLists.txt

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -O2 -Wall -DNDEBUG")

if(CMAKE_COMPILER_IS_GNUCXX)
    if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64")
        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fPIC"  )
        set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fPIC"  )    
    endif()
endif()

if(APPLE)
    set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++0x")
    set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++")
    set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "com.apple.compilers.llvm.clang.1_0")
    set(CMAKE_MACOSX_RPATH 1)
    set(CMAKE_OSX_ARCHITECTURES "x86_64")
endif()

if(WIN32)
    add_definitions(-DUNICODE -D_UNICODE)
    set(TARGET_ARCHITECTURE "x86")
endif()

set(LIB_TYPE SHARED)
include_directories("/path/to/scipoptsuite-3.1.1/scip-3.1.1/src")
include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
add_library(scipLibrary ${LIB_TYPE} "stdafx.cpp")

這是make VERBOSE=1的輸出:

/usr/local/Cellar/cmake/3.2.1/bin/cmake -H/path/to/scip -B/path/to/scip/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/local/Cellar/cmake/3.2.1/bin/cmake -E cmake_progress_start /path/to/scip/build/CMakeFiles /path/to/scip/build/CMakeFiles/progress.marks
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/Makefile2 all
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f source/CMakeFiles/scipLibrary.dir/build.make source/CMakeFiles/scipLibrary.dir/depend
cd /path/to/scip/build && /usr/local/Cellar/cmake/3.2.1/bin/cmake -E cmake_depends "Unix Makefiles" /path/to/scip /path/to/scip/source /path/to/scip/build /path/to/scip/build/source /path/to/scip/build/source/CMakeFiles/scipLibrary.dir/DependInfo.cmake --color=
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f source/CMakeFiles/scipLibrary.dir/build.make source/CMakeFiles/scipLibrary.dir/build
/usr/local/Cellar/cmake/3.2.1/bin/cmake -E cmake_progress_report /path/to/scip/build/CMakeFiles 1
[100%] Building CXX object source/CMakeFiles/scipLibrary.dir/stdafx.cpp.o
cd /path/to/scip/build/source && /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++   -DscipLibrary_EXPORTS -std=c++0x -O2 -Wall -DNDEBUG -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -fPIC -I/path/to/scipoptsuite-3.1.1/scip-3.1.1/src -I/path/to/scip/source    -o CMakeFiles/scipLibrary.dir/stdafx.cpp.o -c /path/to/scip/source/stdafx.cpp
Linking CXX shared library ../output/libscipLibrary.dylib
cd /path/to/scip/build/source && /usr/local/Cellar/cmake/3.2.1/bin/cmake -E cmake_link_script CMakeFiles/scipLibrary.dir/link.txt --verbose=1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++   -std=c++0x -O2 -Wall -DNDEBUG -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -dynamiclib -Wl,-headerpad_max_install_names  -o ../output/libscipLibrary.dylib -install_name @rpath/libscipLibrary.dylib CMakeFiles/scipLibrary.dir/stdafx.cpp.o 
Undefined symbols for architecture x86_64:
  "_SCIPaddBilinTermQuadratic", referenced from:
      _LibSCIPaddBilinTermQuadratic in stdafx.cpp.o
  "_SCIPaddCoefLinear", referenced from:
      _LibSCIPaddCoefLinear in stdafx.cpp.o
  "_SCIPaddCons", referenced from:
      _LibSCIPaddCons in stdafx.cpp.o
  "_SCIPaddQuadVarLinearCoefQuadratic", referenced from:
      _LibSCIPaddQuadVarLinearCoefQuadratic in stdafx.cpp.o
  "_SCIPaddSquareCoefQuadratic", referenced from:
      _LibSCIPaddSquareCoefQuadratic in stdafx.cpp.o
  "_SCIPaddVar", referenced from:
      _LibSCIPaddVar in stdafx.cpp.o
  "_SCIPblkmem", referenced from:
      _LibSCIPexprCreateLinear in stdafx.cpp.o
      _LibSCIPexprCreate in stdafx.cpp.o
      _LibSCIPexprCreateMonomial in stdafx.cpp.o
      _LibSCIPexprCreatePolynomial in stdafx.cpp.o
      _LibSCIPexprtreeCreate in stdafx.cpp.o
  "_SCIPchgVarLb", referenced from:
      _LibSCIPchgVarLb in stdafx.cpp.o
  "_SCIPchgVarObj", referenced from:
      _LibSCIPchgVarObj in stdafx.cpp.o
  "_SCIPchgVarUb", referenced from:
      _LibSCIPchgVarUb in stdafx.cpp.o
  "_SCIPcreate", referenced from:
      _LibSCIPcreate in stdafx.cpp.o
  "_SCIPcreateConsBasicAbspower", referenced from:
      _LibSCIPcreateConsBasicAbspower in stdafx.cpp.o
  "_SCIPcreateConsBasicLinear", referenced from:
      _LibSCIPcreateConsBasicLinear in stdafx.cpp.o
  "_SCIPcreateConsBasicNonlinear", referenced from:
      _LibSCIPcreateConsBasicNonlinear in stdafx.cpp.o
  "_SCIPcreateConsBasicQuadratic", referenced from:
      _LibSCIPcreateConsBasicQuadratic in stdafx.cpp.o
  "_SCIPcreateConsBasicSetpart", referenced from:
      _LibSCIPcreateConsBasicSetpart in stdafx.cpp.o
  "_SCIPcreateProbBasic", referenced from:
      _LibSCIPcreateProbBasic in stdafx.cpp.o
  "_SCIPcreateVarBasic", referenced from:
      _LibSCIPcreateVarBasic in stdafx.cpp.o
  "_SCIPexprCreate", referenced from:
      _LibSCIPexprCreate in stdafx.cpp.o
  "_SCIPexprCreateLinear", referenced from:
      _LibSCIPexprCreateLinear in stdafx.cpp.o
  "_SCIPexprCreateMonomial", referenced from:
      _LibSCIPexprCreateMonomial in stdafx.cpp.o
  "_SCIPexprCreatePolynomial", referenced from:
      _LibSCIPexprCreatePolynomial in stdafx.cpp.o
  "_SCIPexprtreeCreate", referenced from:
      _LibSCIPexprtreeCreate in stdafx.cpp.o
  "_SCIPexprtreeFree", referenced from:
      _LibSCIPexprtreeFree in stdafx.cpp.o
  "_SCIPexprtreeSetVars", referenced from:
      _LibSCIPexprtreeSetVars in stdafx.cpp.o
  "_SCIPfree", referenced from:
      _LibSCIPfree in stdafx.cpp.o
  "_SCIPfreeTransform", referenced from:
      _LibSCIPfreeTransform in stdafx.cpp.o
  "_SCIPgetBestSol", referenced from:
      _LibSCIPprintSolution in stdafx.cpp.o
      _LibSCIPgetBestSol in stdafx.cpp.o
  "_SCIPgetNSols", referenced from:
      _LibSCIPgetNSols in stdafx.cpp.o
  "_SCIPgetStatus", referenced from:
      _LibSCIPgetStatus in stdafx.cpp.o
  "_SCIPincludeDefaultPlugins", referenced from:
      _LibSCIPincludeDefaultPlugins in stdafx.cpp.o
  "_SCIPmajorVersion", referenced from:
      _LibSCIPmajorVersion in stdafx.cpp.o
  "_SCIPmessagePrintError", referenced from:
      _LibSCIPincludeDefaultPlugins in stdafx.cpp.o
      _LibSCIPcreateProbBasic in stdafx.cpp.o
      _LibSCIPchgVarLb in stdafx.cpp.o
      _LibSCIPchgVarUb in stdafx.cpp.o
      _LibSCIPaddVar in stdafx.cpp.o
      _LibSCIPexprtreeSetVars in stdafx.cpp.o
      _LibSCIPexprtreeFree in stdafx.cpp.o
      ...
  "_SCIPmessagePrintErrorHeader", referenced from:
      _LibSCIPincludeDefaultPlugins in stdafx.cpp.o
      _LibSCIPcreateProbBasic in stdafx.cpp.o
      _LibSCIPchgVarLb in stdafx.cpp.o
      _LibSCIPchgVarUb in stdafx.cpp.o
      _LibSCIPaddVar in stdafx.cpp.o
      _LibSCIPexprtreeSetVars in stdafx.cpp.o
      _LibSCIPexprtreeFree in stdafx.cpp.o
      ...
  "_SCIPminorVersion", referenced from:
      _LibSCIPminorVersion in stdafx.cpp.o
  "_SCIPpresolve", referenced from:
      _LibSCIPpresolve in stdafx.cpp.o
  "_SCIPprintOrigProblem", referenced from:
      _LibSCIPprintProblemCIP in stdafx.cpp.o
      _LibSCIPprintProblemMPS in stdafx.cpp.o
      _LibSCIPprintProblemLP in stdafx.cpp.o
      _LibSCIPprintProblemCIPToFile in stdafx.cpp.o
      _LibSCIPprintProblemMPSToFile in stdafx.cpp.o
      _LibSCIPprintProblemLPToFile in stdafx.cpp.o
  "_SCIPprintSol", referenced from:
      _LibSCIPprintSolution in stdafx.cpp.o
  "_SCIPreleaseCons", referenced from:
      _LibSCIPreleaseCons in stdafx.cpp.o
  "_SCIPreleaseVar", referenced from:
      _LibSCIPreleaseVar in stdafx.cpp.o
  "_SCIPsetObjsense", referenced from:
      _LibSCIPsetObjsense in stdafx.cpp.o
  "_SCIPsolve", referenced from:
      _LibSCIPsolve in stdafx.cpp.o
  "_SCIPsubversion", referenced from:
      _LibSCIPsubversion in stdafx.cpp.o
  "_SCIPtechVersion", referenced from:
      _LibSCIPtechVersion in stdafx.cpp.o
  "_SCIPvarGetLPSol_rec", referenced from:
      solGetArrayVal(SCIP_Sol*, SCIP_Var*) in stdafx.cpp.o
  "_SCIPvarGetNLPSol_rec", referenced from:
      solGetArrayVal(SCIP_Sol*, SCIP_Var*) in stdafx.cpp.o
  "_SCIPvarGetOrigvarSum", referenced from:
      _LibSCIPsolGetVal in stdafx.cpp.o
  "_SCIPvarGetPseudoSol", referenced from:
      solGetArrayVal(SCIP_Sol*, SCIP_Var*) in stdafx.cpp.o
  "_SCIPversion", referenced from:
      _LibSCIPversion in stdafx.cpp.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[2]: *** [output/libscipLibrary.dylib] Error 1
make[1]: *** [source/CMakeFiles/scipLibrary.dir/all] Error 2
make: *** [all] Error 2

您可以看到問題是鏈接器給我們一個ld: symbol(s) not found for architecture x86_64錯誤的ld: symbol(s) not found for architecture x86_64 我進行了很多搜索以嘗試找出解決方法,但是我沒有任何運氣。

我不確定是否需要提供stdafx.hstdafx.cpp的內容,因此我暫時將其保留,但是如果有必要,請告訴我,我可以提供它們。

好的,我在不構建scipoptlib地方犯了一個錯誤,因此沒有要構建的庫(對不起,我之前從未創建過動態庫)。 make scipoptlib IPOPT=true SHARED=true/path/to/scipoptsuite-3.1.1運行make scipoptlib IPOPT=true SHARED=true即可。

這是更新的CMakeLists.txt ,它引用了單個共享的scipoptlib

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -O2 -Wall -DNDEBUG")

if(CMAKE_COMPILER_IS_GNUCXX)
    if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64")
        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
        set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
    endif()
endif()

if(APPLE)
    set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++0x")
    set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++")
    set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "com.apple.compilers.llvm.clang.1_0")
    set(CMAKE_MACOSX_RPATH 1)
endif()

if(WIN32)
    add_definitions(-DUNICODE -D_UNICODE)
    set(TARGET_ARCHITECTURE "x86")
endif()

include_directories("/path/to/scipoptsuite-3.1.1/scip-3.1.1/src/")
add_library(scipLibrary SHARED "stdafx.cpp")
target_link_libraries(scipLibrary "/path/to/scipoptsuite-3.1.1/lib/libscipopt-3.1.1.darwin.x86_64.gnu.opt.so")

我現在可以實際生成dylib了,太好了! 但是,現在JNA正在拋出(說它找不到dylib),但這可能是另一個SO線程的主題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM