cpprestsdk: Undefined symbols for architecture x86_64
我已经探访了所有其他问题,但是从我看来,没有一个是我的问题。
在MacBook Pro 16GB内存Intel Core I7上运行OS X El Capitan 10.11.6
我也曾经做过冲泡医生,但是看不到任何会导致此问题的问题。 以下是我的CMakeLists.txt文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | cmake_minimum_required(VERSION 3.0.0) project(WebClient VERSION 0.0.0) include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPLIER_SUPPORTS_CXX14) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPLIER_SUPPORTS_CXX0X) if(COMPLIER_SUPPORTS_CXX14) set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS} -std=c++14") elseif(COMPILER_SUPPORTS_CXX0X) set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS} -std=c++0x") else() message(STATUS"The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler.") endif() FIND_PACKAGE( Boost 1.62 COMPONENTS program_options REQUIRED ) INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIR} ) set(OPT_CPPFLAGS"-I/usr/local/opt/openssl/include -I/usr/local/opt/libiconv/include") set(OPT_LDFLAGS"-v -lcpprest -lboost_system -L/usr/local/opt/openssl/lib -L/usr/local/opt/libiconv/lib -lcrypto -lssl") set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS} ${OPT_CPPFLAGS} -v -g -O3 -fno-common -stdlib=libc++") set(CMAKE_EXE_LINKER_FLAGS"${CMAKE_EXE_LINKER_FLAGS} ${OPT_LDFLAGS}") add_executable(anyExecutable webclient.cpp) TARGET_LINK_LIBRARIES( anyExecutable ${Boost_LIBRARIES} ) include(CPack) |
我使用brew安装cpprestsdk / 2.8.0,其中还包括boost / 1.62.0和openssl / 1.0.2j和libiconv / 1.14。 我的代码来自Wiki cpprestsdk上的教程。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include <cpprest/http_client.h> #include <cpprest/filestream.h> #include using namespace utility; // Common utilities like string conversions using namespace web; // Common features like URIs. using namespace web::http; // Common HTTP functionality using namespace web::http::client; // HTTP client features using namespace concurrency::streams; // Asynchronous streams int main(int argc, char* argv[]) { auto fileStream = std::make_shared<ostream>(); // Open stream to output file. pplx::task<void> requestTask = fstream::open_ostream( U("results.xml") ).then( [=](ostream outFile) { *fileStream = outFile; // Create http_client to send the request. http_client client(U("http://www.dictionaryapi.com/api/v1/references/")); // Build request URI and start the request. uri_builder builder(U("thesaurus/xml/")); builder.append_path(U("ranking"),true); builder.append_query(U("?key"), U("--------------------")); return client.request(methods::GET, builder.to_string()); }) // Handle response headers arriving. .then( [=](http_response response ) { printf("Received response status code:%u ", response.status_code()); // Write response body into the file. return response.body().read_to_end(fileStream->streambuf()); }) // Close the file stream. .then( [=](size_t ) { return fileStream->close(); }); // Wait for all the outstanding I/O to complete and handle any exceptions try { requestTask.wait(); } catch (const std::exception &e) { printf("Error exception:%s ", e.what()); }//try-catch BLOCK return 0; }//Main |
为了节省空间,仅打印一些无法找到的相同错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | [vscode] Executing cmake command: cmake --build /Users/gumpy/git-repos/webapi/build --target all --config Debug -- -j 10 [ 50%] Building CXX object CMakeFiles/anyExecutable.dir/webclient.cpp.o Apple LLVM version 8.0.0 (clang-800.0.38) Target: x86_64-apple-darwin15.6.0 Thread model: posix InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.11.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -disable-free -disable-llvm-verifier -discard-value-names -main-file-name webclient.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 274.1 -v -dwarf-column-info -debug-info-kind=standalone -dwarf-version=2 -debugger-tuning=lldb -coverage-file /Users/gumpy/git-repos/webapi/build/CMakeFiles/anyExecutable.dir/webclient.cpp.o -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0 -I /usr/local/include -I /usr/local/opt/openssl/include -I /usr/local/opt/libiconv/include -stdlib=libc++ -O3 -std=c++14 -fdeprecated-macro -fdebug-compilation-dir /Users/gumpy/git-repos/webapi/build -ferror-limit 19 -fmessage-length 0 -stack-protector 1 -fblocks -fobjc-runtime=macosx-10.11.0 -fencode-extended-block-signature -fcxx-exceptions -fexceptions -fmax-type-align=16 -fno-common -fdiagnostics-show-option -vectorize-loops -vectorize-slp -o CMakeFiles/anyExecutable.dir/webclient.cpp.o -x c++ /Users/gumpy/git-repos/webapi/webclient.cpp clang -cc1 version 8.0.0 (clang-800.0.38) default target x86_64-apple-darwin15.6.0 ignoring nonexistent directory"/usr/include/c++/v1" ignoring duplicate directory"/usr/local/include" as it is a non-system directory that duplicates a system directory #include"..." search starts here: #include <...> search starts here: /usr/local/opt/openssl/include /usr/local/opt/libiconv/include /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1 /usr/local/include /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/include /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include /usr/include /System/Library/Frameworks (framework directory) /Library/Frameworks (framework directory) End of search list. [100%] Linking CXX executable anyExecutable Apple LLVM version 8.0.0 (clang-800.0.38) Target: x86_64-apple-darwin15.6.0 Thread model: posix InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.11.0 -o anyExecutable -L/usr/local/opt/openssl/lib -L/usr/local/opt/libiconv/lib -search_paths_first -headerpad_max_install_names -lcpprest -lboost_system -lcrypto -lssl CMakeFiles/anyExecutable.dir/webclient.cpp.o /usr/local/lib/libboost_program_options-mt.dylib -lc++ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/8.0.0/lib/darwin/libclang_rt.osx.a Undefined symbols for architecture x86_64: "boost::this_thread::interruption_point()", referenced from: boost::condition_variable::wait(boost::unique_lock<boost::mutex>&) in webclient.cpp.o boost::condition_variable::do_wait_until(boost::unique_lock<boost::mutex>&, timespec const&) in webclient.cpp.o "boost::chrono::steady_clock::now()", referenced from: pplx::details::event_impl::wait(unsigned int) in webclient.cpp.o "boost::chrono::system_clock::now()", referenced from: pplx::details::event_impl::wait(unsigned int) in webclient.cpp.o "boost::detail::get_current_thread_data()", referenced from: boost::detail::interruption_checker::interruption_checker(_opaque_pthread_mutex_t*, _opaque_pthread_cond_t*) in webclient.cpp.o ld: symbol(s) not found for architecture x86_64 |
缺少符号名称是由于缺少库。必需的
1 2 | CPPFLAGS = -stdlib=libc++ LDFLAGS = -lcpprest -lboost_system -lboost_thread-mt -lboost_chrono-mt -lssl -lcrypto |
非常感谢大家的帮助。
原始问题:
1 2 3 4 5 6 7 8 9 | "web::uri_builder::append_path(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool)", referenced from: std::__1::__function::__func<main::$_0, std::__1::allocator<main::$_0>, pplx::task<web::http::http_response> (Concurrency::streams::basic_ostream<unsigned char>)>::operator()(Concurrency::streams::basic_ostream<unsigned char>&&) in webclient.cpp.o "web::uri_builder::append_query(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool)", referenced from: web::uri_builder& web::uri_builder::append_query<char [37]>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const (&) [37], bool) in webclient.cpp.o "web::uri_builder::to_string()", referenced from: std::__1::__function::__func<main::$_0, std::__1::allocator<main::$_0>, pplx::task<web::http::http_response> (Concurrency::streams::basic_ostream<unsigned char>)>::operator()(Concurrency::streams::basic_ostream<unsigned char>&&) in webclient.cpp.o "web::uri::encode_impl(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::function<bool (int)> const&)", referenced from: web::uri_builder& web::uri_builder::append_query<char [37]>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const (&) [37], bool) in webclient.cpp.o ... |
您需要使用GNU的工具和
我发现最能避免用户问题和疑问的方法是,始终在OS X和iOS上使用LLVM。即,始终使用
更新的问题:
1 2 3 4 5 6 7 8 9 10 11 | Undefined symbols for architecture x86_64: "boost::this_thread::interruption_point()", referenced from: boost::condition_variable::wait(boost::unique_lock<boost::mutex>&) in webclient.cpp.o boost::condition_variable::do_wait_until(boost::unique_lock<boost::mutex>&, timespec const&) in webclient.cpp.o "boost::chrono::steady_clock::now()", referenced from: pplx::details::event_impl::wait(unsigned int) in webclient.cpp.o "boost::chrono::system_clock::now()", referenced from: pplx::details::event_impl::wait(unsigned int) in webclient.cpp.o "boost::detail::get_current_thread_data()", referenced from: boost::detail::interruption_checker::interruption_checker(_opaque_pthread_mutex_t*, _opaque_pthread_cond_t*) in webclient.cpp.o ld: symbol(s) not found for architecture x86_64 |
有关更新的问题,请参见Boost用户指南中的使用和构建库。您必须使用线程支持来构建Boost(Brew是否这样做?),并且必须链接到Boost线程库(CMake是否正在这样做?)。
我不使用Boost或CMake,所以不能再进一步介绍您了。对于那个很抱歉。
1 set(OPT_CPPFLAGS"-I/usr/local/opt/openssl/include -I/usr/local/opt/libiconv/include")
我不是CMake专家,但这也可能有问题。
绝对应该为
最后一点...您不能使用CMake构建OpenSSL。您必须自己配置一个构建。安装后,您可以以
原因并不容易理解... OpenSSL的
通过使用
看来这可能与您遇到的问题相同,答案是指向
编辑:您的问题是,您正在尝试构建一个需要与其他"库"链接的程序-也就是说,这些段通常是预先编译的代码,它们位于系统的某个位置,并且定义了"符号",这基本上是表示变量或函数名称的另一种方式。
通过在compile命令中加入表示需要链接的参数,可以使编译器知道需要哪些库-在这种情况下,由于与-lcrypto链接,您的前几个问题就消失了,从那时开始,您的代码就能够找到以前"未定义"的"符号"(即变量和函数名称)。
对于其余的问题,在其中添加了" lcrypto",请尝试使用此Wiki中的参数在Linux上构建cpprestsdk。标志似乎是:
1 | -lboost_system -lssl -lcpprest -lboost_chrono |
最后但并非最不重要的一点,您是否遵循在其站点上的Mac OSX上构建此软件的说明?这可能会减轻您的痛苦! :)
编辑:增加了一些。