2013-02-25 8 views
9

Mam bardzo prosty CMakeLists.txt dla C++ projektu, który buduje wspólną bibliotekę:Jak zatrzymać CMake z linkami przeciwko libstdC++

add_library(foo SHARED 
    ${HDR_PUBLIC} 
    ${SOURCES}) 

Podczas łączenia biblioteki, CUpewnij automatycznie używa -lstdC++. Jak mogę to powstrzymać?

+0

Co to jest dokładnie to cię martwi, które są konsekwencje jesteś stara się uniknąć? – Antonio

+0

Nie mogę polegać na libstdC++ w środowiskach, w których chcę wdrożyć ten projekt. –

Odpowiedz

2
set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "") 
set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "") 
set_target_properties(yourtarget PROPERTIES LINKER_LANGUAGE C) 

Źródło: http://cmake.3232098.n2.nabble.com/setting-LINKER-LANGUAGE-still-adds-lstdc-td7581940.html

+0

3 - nieprawda. możesz użyć standardowego C++, takiego jak dla nowego miejsca i dla atomów. Nie zależą one od żadnych standardowych bibliotek. Jest całkiem możliwe, a nawet pożądane kompilowanie z C++ i połączenie z C, a sposobem na to jest użycie LINKER_LANGUAGE do połączenia z C. To nie jest hack. – andrewrk

8

Możesz dodać -stdlib = libC++ do flag kompilatora.

Prosty przykład:

cmake_minimum_required(VERSION 2.8.4) 
project(test) 
set(CMAKE_VERBOSE_MAKEFILE TRUE) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v -stdlib=libc++") 
add_executable(test main.cpp) 

Daj wyjściowa:

"/usr/bin/ld" ... -o test ... -lc++ ... 

Domyślnie:

cmake_minimum_required(VERSION 2.8.4) 
project(test) 
set(CMAKE_VERBOSE_MAKEFILE TRUE) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v") 
add_executable(test main.cpp) 

Link do STDC++:

"/usr/bin/ld" ... -o test ... -lstdc++ ... 

[aktualizacja]

Jeśli nie trzeba połączyć z C++ lib w ogóle - stosować '-nodefaultlibs' jak flaga łącznikowej i '-nostdinC++' do kompilatora flagę. Może być konieczne połączenie niektórych domyślnych bibliotek, takich jak "-lystem".

+0

Hm. Zastanawiam się, czy istnieje podobna opcja dla żadnego stdlib w ogóle. Migrowałem wcześniej do innego systemu kompilacji, ale dziękuję za odpowiedź :) –

+0

Ta odpowiedź nie działa. Zobacz zamiast mnie. – andrewrk