在 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
错误。我已经搜索了很多,试图弄清楚如何解决这个问题,但我没有任何运气。
我不确定是否有必要提供stdafx.h
或stdafx.cpp
的内容,所以我暂时将它们排除在外,但如果有必要,请告诉我,我可以提供它们。
好吧,我犯了一个错误,我没有构建scipoptlib
,所以没有可以构建的库(对不起,我以前从未创建过动态库)。在/path/to/scipoptsuite-3.1.1
运行make scipoptlib IPOPT=true SHARED=true
就是做到这一点所需要的。
以下是引用单个共享scipoptlib
的更新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}")
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线程的主题。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- VC++本机单元测试,找不到调试符号
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 为x86而非x64编译时出错
- 检查TCHAR数组输入是否为带符号整数C++
- C++如何仅使用MOV在x86上实现发布和获取
- 用符号版本替换对函数的所有调用
- 在 x86-64 平台上为 C(++) 中的 64 位无符号参数计算 (a*b)%n FAST
- 为什么WinDbg无法通过Service Pack 2 x86零售符号下载从Windows Server 2003加载符