[cmake-developers] setting LINKER_LANGUAGE still adds -lstdc++

Brad King brad.king at kitware.com
Tue Oct 9 08:01:34 EDT 2012


On 10/09/2012 01:59 AM, James Bigler wrote:
> On Mon, Oct 8, 2012 at 10:40 PM, James Bigler <jamesbigler at gmail.com <mailto:jamesbigler at gmail.com>> wrote:
> In my project I need to manually link against a special version of libstdc++
>     add_library(a SHARED a.cpp)
>     set_target_properties(a PROPERTIES LINKER_LANGUAGE "C")
> 
>     add_library(b SHARED b.c)
> 
>     And here's the compiler output which has the -lstdc++ on the link line for library a, but not for library b.
[snip]
> I told CMake to link the target as if it were a C target, then it decides that
> it needs CXX libraries because it found CXX sources in my library.  
> 
> If I go through the trouble of specifying that I want to link the library as if
> it were C, why do the source files get to override my property?  

CMake is using the C compiler to drive the link call as you request.  That is
all the LINKER_LANGUAGE property says:

 http://www.cmake.org/cmake/help/v2.8.9/cmake.html#prop_tgt:LINKER_LANGUAGE
 "...sets the language whose compiler is used to link the target..."

However CMake knows that the sources have C++ code so it still wants to link against
the C++ runtime libraries.  This is the same feature that allows one to link C++ and
Fortran code together.  It chooses the C++ linker and adds the Fortran runtime libs.

It is a feature and it is working exactly as intended.  The C++ runtime libraries
are detected when the CXX language is enabled.  There is a CMakeCXXCompiler.cmake
file under the CMakeFiles directory of the top-level build directory.  It contains
settings like:

 SET(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;c")
 SET(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "...")

Whenever C++ sources are found in a target CMake will make sure these libraries
appear on the link line or are also implicit for the linker language.  You can
hide the C++ runtime libraries by erasing these values:

 set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "")
 set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "")

That along with setting LINKER_LANGUAGE to "C" should do what you want.

-Brad



More information about the cmake-developers mailing list