I'm very new to xcode and c++ programming so please let me know if I'm going about this all wrong. Basically, I want to create a C++ project that requires a library to deal with making and receiving json calls. (this will eventually be integrating as the 'engine' of an iOs and android app.) I want to use xcode to create this and I tried installing libjson but couldn't get it to recognize. I then tried using JsonCpp and followed the instruction.
1) I downloaded the tar.gz
2) I downloaded the scons python program and in the jsoncpp folder and ran the appropriate command (something like 'python scons.py platform=linux-gcc check')
This created a .a and a .dylib file
Next, i tried to move the files into the project and link it in xcode from 'Link Binary With Libraries' portion of the Build Phases tab in the project settings.
I linked up the code to my file with an include statement:
#include "lib/jsoncpp/json.h"
This led to the following error:
Undefined symbols for architecture x86_64:
"Json::Reader::parse(std::__1::basic_string, std::__1::allocator > const&, Json::Value&, bool)", referenced from:
jsonParser::parseLogin(std::__1::basic_string, std::__1::allocator >&, std::__1::basic_string, std::__1::allocator >&) in jsonParser.o
ld: symbol(s) not found for architecture x86_64
(null): "Json::Reader::parse(std::__1::basic_string, std::__1::allocator > const&, Json::Value&, bool)", referenced from:
All I am trying to do is set up this library but It has been keeping me from working on my code for the past day looking for a solution.
For the libjson library, I tried following the directions here but with similar issues:
Cannot Install libjson in c++ Embedding in XCode 4 Project
Does anyone have any advice on steps I can take to set this up? Thank you for your time.
In the project navigator (left side of XCode), click above your project. Then:
Build Phases -> Link binary with libraries
Here is where you add all libraries and/or frameworks that will be linked to your application. Leave this page open, then drag and drop the libraries inside the libraries area... that's it! no secret!
If it doesn't work. You are probably with a wrong library. Try lipo -info library to check if the library architeture is the same you are trying to use (x86_64 in this case).
If it still doesn't work. You are probably with C++ incompatibility. Any mixing of libstdc++ and libc++ in builds will cause trouble. All C++11 code built with clang should set an environment variable: CXX=clang++ -std=c++11 -stdlib=libc++, or add CXX="clang++ -std=c++11 -stdlib=libc++" as an argument to configure.). If you compiled libjson via command line, check it again. But, for libJSON, it's much easier if you open a new XCode Project and add the files to the project instead of compile it via command line.
In the end, I tried just copying the entire source project into my xcode project and building it. it ended up solving the issue.
This is How I solved the issue:
download libjson from sourceforge
unzip it.
-
move the _internal folder, libjson.h, and JSONOptions.h into the
xcode project folder
add those files to your xcode project
remove the test suite files from this project as you don't need them
build your main to test it and you should be good to go.
Related
I've previously compiled OpenCV 3.0 successfully following this guide, which essentially consists of the following steps:
Download all the prerequisites (XCode, Command Line Tools, CMake and OpenCV source)
Build static libs by configuring CMake (via gui) with:
Uncheck BUILD_SHARED_LIBS
Uncheck BUILD_TESTS
Add an SDK path to CMAKE_OSX_SYSROOT (if it matters, I used /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk).
Add x86_64 to CMAKE_OSX_ARCHITECTURES (emphasis mine, this seems to be the issue, I'm sure I've followed this step)
Uncheck WITH_1394
Uncheck WITH_FFMPEG
Configure and generate via CMake, then make and sudo make install from the CLI.
All of the above alone works fine.
I'm now looking to compile OpenCV with the extra modules. According to their read-me it should be as simple as filling out OPENCV_EXTRA_MODULES_PATH to <opencv_contrib>/modules in CMake and then building as usual.
I followed the steps outlined above with the added parameter and building OpenCV succeeds, however, when trying to use one of the extra modules in a program (namely cv::ximgproc::createStructuredEdgeDetection, if it matters), I'm getting the following error when compiling:
Undefined symbols for architecture x86_64:
"cv::ximgproc::createStructuredEdgeDetection(cv::String const&, cv::Ptr<cv::ximgproc::RFFeatureGetter const>)", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
I've included the header which should include the above:
#include <opencv2/ximgproc.hpp>
I'm compiling via XCode, where I've set an additional header search path of /usr/local/include and a library search path of /usr/local/lib for the project, am I missing something here?
Standard OpenCV functionality works fine.
What could be the issue and how would I go about solving it?
OpenCV contrib modules are built correctly.
You just need to add the contrib libs to your dependencies, in this case adding: -lopencv_ximgproc.
All available libs can be found under <OPENCV_DIR>/install/ folder.
E.g. in my 32bit vc12 static build are in<OPENCV_DIR>/install/x86/vc12/staticlib folder.
Recently I started working with Boost on Windows for a project. It needs to be cross-platform so I also installed it on Mac. Unfortunately; whenever I add it to the Xcode project it gives me a big slew of linker-errors and conversion-warnings.
Example of one of the linker-errors:
Undefined symbols for architecture x86_64:
"boost::system::system_category()", referenced from:
___cxx_global_var_init2 in main.o
boost::asio::error::get_system_category() in main.o
boost::system::error_code::error_code() in main.o "boost::system::generic_category()", referenced from:
___cxx_global_var_init in main.o
___cxx_global_var_init1 in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code
1 (use -v to see invocation)
Example of one of the conversion-warnings:
In file included from
/usr/local/Cellar/boost/1.57.0/include/boost/date_time/posix_time/posix_time_types.hpp:16:
/usr/local/Cellar/boost/1.57.0/include/boost/date_time/posix_time/posix_time_duration.hpp:24:21: warning: implicit conversion loses integer precision: 'long' to
'hour_type' (aka 'int') [-Wshorten-64-to-32]
time_duration(h,0,0)
I tried several installation methods and configuration methods but it still won't work.
These are my steps:
Compile Boost or get a compiled version of Boost.
Create an XCode project.
Enter this sample code in the main class.
Add the header and library paths to the Xcode project file.
Build.
Compile options I have tried:
Compiling from source using the official guide.
Compiling from source using a few scripts I found here on Stackoverflow.
Installing the brew package manager and downloading a package with binaries.
Configuration options I have tried:
Setting the header search path to /usr/local/Cellar/boost/1.57.0/include or equivalents and
setting the library search path to /usr/local/Cellar/boost/1.57.0/lib or the equivalents.
Setting just the header search path but not the library path.
Option 1 but recursive (causes more errors).
I would appreciate it a lot if someone could point me in the right direction. I think it's something Xcode related since all of the compiled versions give me the same errors.
I found the answer. After the header- and library paths are added to the projects search paths you need to go to "Build Phases". There you need to add the individual libraries you need to the "link libraries to binary" subsection. You can find the necessary files in the lib folder (in the boost folder).
You can choose for either the library files with .a extension or with the .mt.dylib extension. If you choose the .a extension files the library will be added to the compiled version of your program. If you choose the .mt.dylib files then the libraries will not be added to your compiled program. In this case you are assuming the dynamic library files are already present on the computer running the program.
I've built a 32 bit library that is a requirement to my project. Here's its lipo info:
LP:lib hcabral$ lipo -info Release-iphoneos/librmservices_iphone.a
input file Release-iphoneos/librmservices_iphone.a is not a fat file
Non-fat file: Release-iphoneos/librmservices_iphone.a is architecture: armv7
I link the library in my project, it shows up in "Link Binary with binaries", etc., and yet I get this error:
Undefined symbols for architecture armv7:
"std::_List_node_base::hook(std::_List_node_base*)", referenced from:
xpath::YaccParser::getObjectPointer(uft::Value*&, bool) in librmservices_iphone.a(xpath_yacc.o)
xpath::YaccParser::performLexicalAnalysis(uft::Value*&) in librmservices_iphone.a(xpath_yacc.o)
"std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)", referenced from:
xpath::Context::removeDynamicContext(uft::Value const&) in librmservices_iphone.a(xpath_context.o)
"_kCFProxyPasswordKey", referenced from:
DLProxySettingsController::getSystemProxySettings() in librmservices_iphone.a(DLProxySettingsController.o)
"_kCFNetworkProxiesHTTPProxy", referenced from:
(...)
All the projects I limited to armv7 and no solution. Any ideas?
So, I have a project A that is pure Objective-C, but it depends on a Project B that is C/C++ and Objective-C, and happens to be 32-bit code only.
Up until Mavericks and Xcode 5.1.1, I built Project B for all platforms (Release and Debug for iOS and i386) in order to debug, run tests and eventually deploy. Project B has its own set of linker flags and options that make it very special.
In project A, I would link the binaries of Project B (libProjectB.a) and it has always worked.
However, during this last iteration, Project A build process complained about missing symbols for armv7, which confused me, because project B is compiled ONLY in armv7 and i386.
The only way I manage to remove 30+ linking errors, was by linking the following frameworks:
libstdc++.6.0.9.dylib
CoreText.framework
CFNetwork.framework
Foundation.framework
I hope these don't look like random frameworks to you, but I found out by adding one by one, based on the type of linking error. For example, I added the CFNetwork only after opening the C++ code and noticing that the symbols would be part of it.
Anyway, again, I don't know why it happened yet, but it happened by using Yosemite and Xcode 6.1. Hope this can shed a light on someone.
I'm trying to create a library of a group of files .cpp and .hpp in xcode.
All files run right in the simulator and in the device without library.
And I have created the library and I have run it in the simulator (architecture x86) and run quite well.
When I tried to run the app with the library in the device I get an error like I would have forgotten any files:
Undefined symbols for architecture armv7:
"ssm::partialSortGreater(int, std::__1::vector<float, std::__1::allocator<float> > const&, std::__1::vector<int, std::__1::allocator<int> >&)", referenced from:
but It's running in the simulator with the same files, it's mental :S
thanks :)
Update:
BuildSettings:
Library and App
Update 2:
Moreover if I Archive the app and I install it with iTunnes, works!!! in the device :S Very weird
A few things to check in this instance:
Make sure the library is not set to "Build active architecture only" and make sure that it has ARMv7 set as a valid architecture.
Also, make sure that the main project has your library listed in the Build phases under Target Dependancies and Link Binary with Libraries.
If your library is not building the proper architecture or if your main project is not dependent on it's changes and not currently being linked against the static library your main project will not know that the static library exists.
I wish to use Tesseract with OpenCV on a C++ project (not iOS) I'm working, but I'm unable to get Tesseract to work with XCode. I've added the .dylib files for Leptonica and Tesseract and it works fine, but then I get the following error when I run the APIExample program
read_params_file: parameter not found: save_raw_choices
If I do not add the .dylib files and try adding the header files obtained through Homebrew, I get the following error
Undefined symbols for architecture x86_64:
"tesseract::TessBaseAPI::GetUTF8Text()", referenced from:
tesseractTest() in main.o
"tesseract::TessBaseAPI::End()", referenced from:
tesseractTest() in main.o
I'm a little inexperienced with development in Mac OS X.
I encountered same problem and found only this remark on google groups:
http://code.google.com/p/tesseract-ocr/issues/detail?id=990
Basically, just use different tessdata - e.g. download spanish and set it as language. It would pass that step and show some results. Though they were not splendid in my case but at least you will see it working:).
Then I would recommend asking at the project google group for help...
I had the same problem when I didn't include the tesseract c flags and libraries when compiling.
if you add this to your cflags: pkg-config --cflags tesseract
and this to your libs: pkg-config --libs tesseract
then it should compile.
I know it is an old question but I didn't found anythink online and after hours I solved this issue by adding the line (-ltesseract) to the Build Settings -> Other Linker Flags in xCode