3

How does one add third party .o and .h files to a Qt C++ project in QtCreator? I want to add some compiled .o files from John The Ripper to my probject (ignore the non-cross-platformness of that). As a test, a wrote a small C program (outside QtCreator) and linked it against common.o and MD5_std.o and it worked fine; I can just do gcc -o runme common.o MD5_std.o simpleprogram.c, but with QtCreator, nothing seems to work. I keep getting undefined references.

I tried adding this to the .pro file:

LIBS += "$$_PRO_FILE_PWD_/common.o" "$$_PRO_FILE_PWD_/MD5_std.o" 

And this:

LIBS += /full/path/to/common.o /full/path/to/MD5_std.o

I also tried setting INCLUDEPATH and adding the .o files as 'other files' and 'sources' in the .pro file, but no matter what I do, the calls to the functions in the .o files always result in undefined references.

Additionally, from all the advice I found on the internet (which did work for them, weirdly enough), I didn't find a way to add the .o files to the project in such a way that they are copied to the shadow build directory, and linked from there. I seems wrong to refer to the $$_PRO_FILE_PWD_.

BTW: What I did get to work, is linking a system lib. When I add -lcrypt to LIBS and include unistd.h, I can call the crypt function just fine.

László Papp
  • 51,870
  • 39
  • 111
  • 135
Halfgaar
  • 732
  • 2
  • 7
  • 32
  • Have you tried adding them like this: `OBJECTS += common.o MD5_std.o`? – Guilherme Bernal Jan 02 '14 at 00:06
  • @GuilhermeBernal I hadn't, but it doesn't seem to help. When I add a non-exsting object file, it does give a proper error, but pointing to my object files still gives undefined references upon build. – Halfgaar Jan 02 '14 at 00:15
  • Isn't it building you main as c++ instead of c? This would explain the problem. – Guilherme Bernal Jan 02 '14 at 00:17
  • @GuilhermeBernal It's a C++ project, that's correct. However, the crypt function I _am_ able to call (from within C++ objects) is from a C library as well, so would that really be a problem? – Halfgaar Jan 02 '14 at 00:24
  • 1
    Are you declaring your C functions with the proper `extern "C"`? – Guilherme Bernal Jan 02 '14 at 00:28
  • I didn't use the extern keyword, no. Not for crypt, nor for the john stuff. Should I? I'll look into it, – Halfgaar Jan 02 '14 at 00:28
  • Ah, that did the trick :). I declared all functions as `extern "C"` in the .header file I copied from John The Ripper. Thanks :) – Halfgaar Jan 02 '14 at 00:34

1 Answers1

7

Based on your comment discussion, you seem to have at least two issues ongoing:

1) You need to use the OBJECTS variable in qmake to have the operation you have with the -o argument of gcc. Here you can find the documentation of it:

OBJECTS

This variable is automatically populated from the SOURCES variable. The extension of each source file is replaced by .o (Unix) or .obj (Win32). You can add objects to the list.

Based on this, you would be writing something like this:

OBJECTS += common.o MD5_std.o

Note that you will also need to use "extern C" linkage specification to avoid the name mangling. That is necessary to be able to link when using your third-party object coming from C code and such compilation. You would need to be writing this for your corresponding C functions:

extern "C"
{
    ...
}
László Papp
  • 51,870
  • 39
  • 111
  • 135