Reputation: 65
I have a c++ app that I'm trying to port to iPhone and to start off I'm trying to replace my c++ texture loader with an obj-c++ texture loader so that I can make use of the cocoa libraries.
A lot of my c++ files (.cpp files) call the texture loader with something like:
GLuint mTexture = TextureLoader::LoadTexture("file.png") //LoadTexture is a static method`
but whenever I try to make a TextureLoader class (inside a .mm file) that has Obj-C code, I am forced to make the calling class also a .mm file.
I want to avoid a creep of .mm usage. How can I do it? Is it even possible?
Basically I have a .mm file that has...
GLuint TextureLoader::LoadTexture(const char* path)
{
//...lots of c and obj-c code
return texture
}
and is apart of a c++ class (or is it obj-c++ at this point?)
I want to be able to use it from a .cpp file without having to make the calling class also .mm
Is there anyway to do this?
Cheers guys.
Upvotes: 1
Views: 1729
Reputation: 2561
Not sure on the size of the code involved, but if it had a pretty small interface, you could write a C wrapper for your C++ code, and then use extern C { /* ... */ }
around the header file declarations and function definitions.
This would essentially "hide" the C++ calls from Objective-C, and would allow you to circumvent the requirement of renaming your files from the m
to the mm
extension, and/or the requirement of compiling the calling files as Objective-C++.
Objective-C++ uses different compiler rules and is slower than a standard Objective-C compile.
Upvotes: 0
Reputation: 12129
In XCode, right-click on your .cpp
file and select “Get Infos”. In the “General” tab, change the file type to sourcecode.cpp.objcpp
. This will build this file and only this file as Objective C++.
Upvotes: 0
Reputation: 34054
The simplest thing to do is just to compile everything as Objective-C++. You don't have to change all of your extensions; leave 'em as .cpp
and set Xcode to compile everything as Objective-C++: under the build settings of your project, in the category "GCC X.X - Language", change "Compile Sources As" to "Objective-C++".
(I assume your problem is that you have a whole bunch of .cpp
files, and you don't feel like renaming them all to .mm
. Compiling as Objective-C++ will have no effect on the ones that don't actually use any Objective-C stuff (with only very rare exceptions), and it'll make your life easier for the ones that do.)
Upvotes: 1
Reputation: 96984
I want to avoid a creep of .mm usage. How can I do it? Is it even possible?
Not if you want to use Objective-C++, no.
Upvotes: 4
Reputation: 101665
I'm not aware of any way to do that. However, you are not required to put all C++ member function definitions in a single file - just stick all the pure C++ stuff into .cpp
, and those that need ObjC into .mm
.
As well, if you actually have the same repeated ObjC code (perhaps parametrized), then refactor it into a plain C function or C++ class in one separate .mm
- such that there are no ObjC constructs in the corresponding .h
- and then use that function/class where needed by including the header.
Upvotes: 0