Friday, October 24, 2008

[ILINK32 Error] Fatal: Unable to open file .obj

If you have been playing around with Delphi packages compiled for C++ Builder in Borland Developer Studio or CodeGear RAD Studio, you'll have undoubtedly run into this error message. You could also run into that if you are not dealing with Delphi packages (e.g. using a run-time package, static library).

Let's start with Delphi packages.

What is suspicious is the way the linker reports the error - such as [ILINK32 Error] Fatal: Unable to open file MyComponent.obj. You search the entire hard drive for MyComponent.obj only to find the closest thing to be MyComponent.dcu, which is compiled in Delphi from MyComponent.pas. So how and where do you get MyComponent.obj?

The answer is, this .obj file is actually in a container with the extension of .LIB. If your package with MyComponent.pas is called MyPackage.bpl, then you need to look for MyPackage.lib. While an installed package should get automatically added to the default list of included packages when you create a new project file, it doesn't always happen (i.e. bug). All you have to do then is manually open up your current project file (.cbproj) in a text editor and add MyPackage.lib into the tag. Reload your project and you should be able to link successfully.

If you are not dealing with Delphi packages and you get that error message, that means you're trying to use a static library, or a run-time package (and some times even design-time package which are not dropped onto a form / data module). This could easily be fixed and is the expected way linkers work. There are 2 ways you can fix this:

1) Add the lib file to the project (I don't like this, as you rely on the user of the static library to remember to add the lib file every time they use it in a new project)
2) Add the following line to a header file which is guaranteed to be included when the static library is used:
#pragma comment(lib, "your library name.lib")

That's it.

I haven't tried C++ Builder 2009, but I hope CodeGear have found a better way to do this. Actually, I'd suggest that they simply make all Delphi compiler generated C++ Builder files include that #pragma comment(lib, ...) line so that we never have to muck around with the .cbproj files any more. In fact, this would also mean that there will be no annoying messages that prompts you to remove packages you don't need when you create and try to save a new project.

7 comments:

S0mbre said...

Thank you! I've been looking for a solution to that bug for ages!!!

S0mbre said...

...But still this didn't solve my problem. I work in RAD Studio 2007 (C++ Builder). Now I created a console project to work with the GNU GSL library (http://www.gnu.org/software/gsl/). Having downloaded the distribution with the 2 dll's needed (libgsl.dll and libgslcblas.dll), I next used implib to convert them to lib's. So far so good. But when I simply added both resulting lib's to the project, I got this stupid Linker "can't find .OBJ file" error. Well, on your advice I pinned these two pragma lines ("#pragma comment(lib, "libgsl.lib")" and "#pragma comment(lib, "libgslcblas.lib")") to a header file and included it. Compiling now without adding the libraries I get another error: [ILINK32 Error] Error: Unresolved external '_gsl_sf_bessel_J0' referenced from PROJECT_FOLDER\MAIN.OBJ

Adding the lib's back in brings back the 'good old' "can't find .OBJ file" error... Man, it drives me crazy!

Dirk Schippers said...

Really, thank you. I had a similar problem with c++ builder packages.

BUT!!! I FOUND OUT WHAT TRIGGERS THE BUG!!!

If happens when you import more than one package at the same time. The problem is gone when you import the packages one by one. Then you no longer need to hack it in the cbproj-file yourself.

Thanks again for putting me on track.

Anonymous said...

I had an error

Link Error: Unable to find file ¬.obj , where symbol ¬ according to extended ASCII table is

DEC HEX UNICODE SYMB MEAN

170 AA U+00AC ¬ not sign


Please, explain why that could be?

Zach Saw said...

@Anonymous

That's a completely different error. What you're seeing is most likely due to corrupted lib / project file or even IDE.

Software Developer said...

Hello everyone,
Perhaps I faced the same problem as the topic starter.
But I didn't get in which tag .cbproj file I have to put name of libraries, and what type of library (bpl, lib) i should put ?
Could anybody explain me this?
Thanks in advance

Mohamed Koker said...

Which tag do I need to edit in the .CBPROJFILE to include the referenced Delphi packages?