1

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.

5 Answers 5

4

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.

Sign up to request clarification or add additional context in comments.

Comments

1

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.)

Comments

0

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.

2 Comments

Thanks Pavel, you got it exactly. I think the problem was that I must have had Obj-c code in the header file of my texture loading code. That meant that when my c++ code came to include the .h file, the compiler didn't like it. I'll try and summarise: Say I have Foo.cpp and Foo.h (c++ only) and Foo.cpp needs to include TextureLoader.h, which contains a c++ class definition whose member methods use obj-c code (in TextureLoader.mm). Make sure there is NO obj-c or cocoa code in TextureLoader.h or else Foo.cpp won't be able to #include it.
The obvious answer is - don't define your member functions that use ObjC constructs in the header file; define them in .mm file instead.
0

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++.

Comments

0

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.