Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CMake: Linking statically against libgcc and libstdc++ into a shared library

Tags:

Problem:

I am having difficulties linking glibcc/glibc++ into a shared library using CMake and GCC4.9 on my Ubuntu 16.04 installation.

Additional conditions:

Loading the shared library gives a problem om the Red Hat production environment(where I copy it to), I believe because it uses a different libstc++ version(error: GLIBCXX_3_4_20 not found). I do not have sudo rights and cannot upgrade the machine.

As I derived from this blog, this post, I tried linking static linking against libgcc and libgc++ using:

set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static") 

and againg using

set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static") 

But that doesn't work. What does work is this CMake script:

add_library(myLib SHARED ${SOURCE_FILES}) set(CMAKE_EXE_LINKER_FLAGS " -static") target_link_libraries(myLib -static-libgcc -static-libstdc++) 

This must be the wrong way of doing this, to my knowledge -static-libgcc and -static-libstdc++ are linker options and not libraries...

Question: How do I link statically against -libgcc and -libstdc++ correctly?

Thanks in advance!

like image 938
DA-- Avatar asked Aug 01 '16 08:08

DA--


2 Answers

Yes, target_link_libraries is a correct way to set linker flags or linker options.

Documentation of target_link_libraries:

Specify libraries or flags to use when linking a given target.

Item names starting with -, but not -l or -framework, are treated as linker flags.

https://cmake.org/cmake/help/v3.0/command/target_link_libraries.html (emphasis not in original)

like image 155
SpamBot Avatar answered Sep 18 '22 14:09

SpamBot


As of cmake 3.13, there is a new cmake function for general linker options:

https://cmake.org/cmake/help/v3.13/command/target_link_options.html

target_link_options(<target> [BEFORE]   <INTERFACE|PUBLIC|PRIVATE> [items1...]   [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) 

The appropriate way to specify libraries to be linked is still:

https://cmake.org/cmake/help/v3.13/command/target_link_libraries.html

target_link_libraries(<target>   <PRIVATE|PUBLIC|INTERFACE> <item>...   [<PRIVATE|PUBLIC|INTERFACE> <item>...]...) 

There are a few different signatures depending on whether or not you want these libraries to be propagated to dependent targets, so be sure to check the docs.

like image 20
solvingJ Avatar answered Sep 19 '22 14:09

solvingJ