user946230
user946230

Reputation: 269

Including Files - Shared Source And Duplicate Names

I have a situation where I am using two libraries which have duplicate header file names. For example timer.h exists in both libraries. I think the normal solution to this would be to explicitly specify the directory in the include like #include <dir1/timer.h> or #include <dir2/timer.h> so that the compiler has a clue as to which I am specifying. However, my problem is that one of the libraries I am using is not in a sub directory of my project. It exists somewhere else at a higher level. That is...

This was done so that multiple projects could reference Library1. It seemed like a good idea at the time. However, now that I have the name conflict of Library2 it creates issues. One other important detail is that I often use two different workstations. The absolute location of Library1 on these workstations is not the same, nor is the relative location (with respect to the project folder) the same between the two. What I have been doing to this point is adding both absolute locations to the search path of the preprocessor.

Anyway, I'd appreciate any guidance you might offer.

Upvotes: 3

Views: 87

Answers (2)

dave
dave

Reputation: 4922

You are on the right track with "dir1/timer.h" and "dir2/timer.h". But rather than think of it as dir think of it as "project1/timer.h". Now in your makefile you will need to have the location of project1 added to your include search path if it's not in a common location.

You shouldn't have relative paths in either your code (no ../file.h). They should be relative to the base directory of their project (e.g. #include <sys/socket.h> or #include <linux/sched.h>). Then it's up to your makefile to find them (those two examples are in the standard search path so they will work). For your case you can -I<path to project directory> and then #include "other_project/library.h".

Upvotes: 3

Mikkel K.
Mikkel K.

Reputation: 373

I'd prefer including a copy of a specific version of the external library with my project and updating to a newer version as needed (but not actually changing the external library from the project). If you just refer to the current (changing) version that everybody uses, then your project may change behavior without even having its code changed. A release of your project would also have to refer to whatever version of the library you were using at that point in time to be complete.

If you did it that way, the relative paths are always the same (say, "../ExternalLib") if you want to use that approach. Or you can do as dave suggests.

Upvotes: 2

Related Questions