[CMake] Add libraries to end of compilation line ...

Michael Burns mburns83 at yahoo.com
Thu Jun 26 12:14:36 EDT 2014


Hello, Angeliki.

Yes, you are correct. I want to link against the static libraries (.a)
rather than the shared objects (.so). I know it "shouldn't" make a
difference, but it is. Adding the "-static" option to the gcc command
line causes the link failures to happen. Without that option, everything
builds just fine.

Ideally, I would just like to set some property that caused these common
libraries to be appended to the end of the compilation line as defined
in link.txt. Unfortunately, I haven't seen anything like that.

Your suggestion seems to be the only option. That means I will need to
update nearly 180 CMake scripts. And, we'll need to make sure any new
scripts contain this value for every instance of TARGET_LINK_LIBRARIES
statement. A painful process!

Thank you for your response, Angeliki.

Mike


On 6/26/2014 1:16 AM, Angeliki Chrysochou wrote:
> Hi Michael,
>
> I think what matters is the correctly set dependencies for your build
> to succeed (target_link_libraries). By "statically link" you mean you
> link against static libraries that were before shared objects, right?
> This should, to my knowledge, not have any influence to how you use
> target_link_libraries.
>
> My assumption would be that maybe these static libraries are not set
> as linking dependencies to all necessary target_link_libraries.
>
> If I understood your problem correctly, if you want to have a set of
> libraries that are linking dependencies to all your libraries, you
> could use the following approach: set a variable (list or simple) in
> your top level CMakeLists.txt file, and then by default add it to all
> target_link_libraries. You could modify these "global dependencies" or
> even have this variable empty with no problems.
>
> For example your top level CMakeLists.txt could contain:
>
> set(GLOBAL_LIBRARIES "LibA.so" "LibB.so")
>
> and then have this in the CMakeLists.txt files of the rest of your
> libraries:
>
> target_link_libraries(${YOUR_LIB}
> ${GLOBAL_LIBRARIES}
> ...
> )
>
> Maybe there is some better practice out there for this, if so, I would
> also be interested to know :)
>
> Cheers!
> Angeliki
>
>
> On Wed, Jun 25, 2014 at 7:46 PM, Michael Burns via CMake
> <cmake at cmake.org <mailto:cmake at cmake.org>> wrote:
>
>     Hello, all.
>
>     I work on a cross-platform project that has many libraries and several
>     applications. CMake on Linux naturally adds the TARGET_LINK_LIBRARIES
>     specified in the libraries after those specified in the
>     TARGET_LINK_LIBRARIES for the application. However, there are several
>     common system libraries, for example pthread, that are used by many of
>     the libraries and most of the applications.
>
>     The current scripts only have the common system libraries
>     specified in a
>     few scattered places. And, it works. However, we're trying to
>     change to
>     statically link these libraries and the links are failing with
>     "undefined reference" errors. When I manually modify link.txt to
>     add the
>     various system libraries to the end of the compilation line, it works.
>     So, rather than going through all of the scripts (of which there are
>     many), I would like to be able to list them so they are added to
>     the end
>     of every link.
>
>     Is there a way to identify libraries in such a way that they are added
>     to the end of the compilation line rather than having to add those
>     libraries to every library and application that requires them?
>
>     Thanks!
>
>     Mike
>



More information about the CMake mailing list